package cz.cvut.fel.restauracefel.library.service;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JComboBox;
import javax.swing.text.JTextComponent;
/**
* Trida, ktera slouzi pro kontrolovani vstupnich komponent. Jednotlive metody
* kontroluji splneni podminek.
*
* Take zajistuje "cisteni" vstupnich polozek.
*
* @author Jarda
* @author Tomas Hnizdil
*/
public class Validator {
private static SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");
/**
* Konstruktor tridy Validator.
*/
private Validator() {
}
/**
* Metoda navraci ciselnou hodnotu obsazenou v komponente JTextComponent.
*
* @param com instance tridy JTextComponent nebo jejich potomku
* @return cisela hodnota
* @throws java.lang.NumberFormatException
*/
private static double getDouble(JTextComponent com) throws NumberFormatException {
return Double.parseDouble(com.getText());
}
/**
* Metoda testuje, zda vstupni udaje ve vstupni komponente (instance tridy
* JTextField nebo jejich potomku) obsahuje ciselnou hodnotu (double).
*
* @param com instance tridy JTextComponent nebo jejich potomku
* @return true, pokud je vstup cislo (double), false pokud nikoliv
*/
public static boolean isDouble(JTextComponent com) {
double d;
try {
d = Validator.getDouble(com);
} catch (NumberFormatException nfe) {
return false;
}
return true;
}
/**
* Metoda testuje, zda vstupni udaje ve vstupni komponente (instance tridy
* JTextField nebo jejich potomku) obsahuje ciselnou hodnotu (double).
*
* @param com instance tridy JTextComponent nebo jejich potomku
* @return true, pokud je vstup cislo (double), false pokud nikoliv
*/
public static boolean isInt(JTextComponent com) {
int i;
try {
i = Integer.parseInt(com.getText());
} catch (NumberFormatException nfe) {
return false;
}
return true;
}
/**
* Metoda testuje, zda vstupni udaje ve vstupni komponente (instance tridy
* JTextField nebo jejich potomku) obsahuje ciselnou kladnou hodnotu (double).
*
* @param com instance tridy JTextComponent nebo jejich potomku
* @return true, pokud je vstup kladne cislo (double), false pokud nikoliv
*/
public static boolean isPositiveDouble(JTextComponent com) {
double d;
try {
d = getDouble(com);
} catch (NumberFormatException nfe) {
return false;
}
if (d < 0) {
return false;
}
return true;
}
/**
* Metoda testuje, zda vstupni udaje ve vstupni komponente (instance tridy
* JTextField nebo jejich potomku) obsahuje ciselnou kladnou hodnotu (int).
*
* @param com instance tridy JTextComponent nebo jejich potomku
* @return true, pokud je vstup kladne cislo (int), false pokud nikoliv
*/
public static boolean isPositiveInt(JTextComponent com) {
int i;
try {
i = Integer.parseInt(com.getText());
} catch (NumberFormatException nfe) {
return false;
}
if (i < 0) {
return false;
}
return true;
}
/**
* Metoda testuje, zda vstupni udaje ve vstupni komponente (instance tridy
* JTextField nebo jejich potomku) obsahuje ciselnou kladnou hodnotu (int)
* vetsi nez druhy parametr funkce.
*
* @param com instance tridy JTextComponent nebo jejich potomku
* @return true, pokud je vstup kladne cislo (int), false pokud nikoliv
*/
public static boolean isGreaterInt(JTextComponent com, int value) {
int i;
try {
i = Integer.parseInt(com.getText());
} catch (NumberFormatException nfe) {
return false;
}
if (i > value) {
return false;
}
return true;
}
/**
* Metoda testuje, zda vstupni pole obsahuje nejaky text.
*
* @param com instance tridy JTextComponent nebo jejich potomku
* @return true, pokud je v komponente text, false pokud nikoliv
*/
public static boolean isText(JTextComponent com) {
if (com.getText().isEmpty()) {
return false;
}
return true;
}
/**
* Zkontroluje zadane datum, zda existuje ci nikoli
* @param d den
* @param m mesic
* @param y rok
* @return true, pokud je datum platne.
*/
private static boolean isValidDateHuge(int d, int m, int y) {
if ( //Základní podmínka
((m >= 1) && (d >= 1) && (y >= 1))
&& //Dny v měsíci
(((m == 1) && (d <= 31))
|| ((m == 2) && (d <= 29))
|| ((m == 3) && (d <= 31))
|| ((m == 4) && (d <= 30))
|| ((m == 5) && (d <= 31))
|| ((m == 6) && (d <= 30))
|| ((m == 7) && (d <= 31))
|| ((m == 8) && (d <= 31))
|| ((m == 9) && (d <= 30))
|| ((m == 10) && (d <= 31))
|| ((m == 11) && (d <= 30))
|| ((m == 12) && (d <= 31)))
&& //Neplatné dny co neexistují
((y != 1752)
|| ((y == 1752) && (m != 9))
|| ((y == 1752)
&& (m == 9)
&& ((d <= 2) || (d >= 14))))
&& //Juliánský kalendar
( //ošetření, aby to prošlo dál kdyby to nebylo odsud
(y >= 1753)
|| ((y == 1752) && (m >= 10))
|| ((y == 1752) && (m == 9) && (d >= 14))
|| //samotné řešení přestupných roků
((y % 4 == 0) && (m == 2) && (d <= 29))
|| ((y % 4 != 0) && (m == 2) && (d <= 28))
|| (m != 2))
&& //Gregoriánský kalendář
( //ošetření, aby to prošlo dál kdyby to byl Julianský kalendář
(y <= 1751)
|| ((y == 1752) && (m <= 8))
|| ((y == 1752) && (m == 9) && (d <= 2))
|| //samotná řešení přestpupným roků
((y % 4 == 0) && (m == 2) && ((y % 100 != 0) || (y % 400 == 0)) && (d <= 29))
|| ((y % 4 != 0) && (m == 2) && (d <= 28))
|| (m != 2)
|| ((y % 4 == 0) && (m == 2) && (y % 100 == 0) && (d <= 28)))) {
return true;
} else {
return false;
}
}
/**
* Metoda kontrolujici spravnost datumu.
*
* @param date textovy retezec reprezentujici datum
* @return V pripade, ze retezec reprezentuje validni datum, tak vrati objekt
* tridy Date pro dany retezec; jinak vrati null
*/
public static Date isValidDate(String date) {
String n = date.replace('.', ':');
String array[] = n.split(":", 3);
int day = 0, month = 0, year = 0;
Date d = null;
try {
day = Integer.parseInt(array[0]);
month = Integer.parseInt(array[1]);
year = Integer.parseInt(array[2]);
if (Validator.isValidDateHuge(day, month, year) == false) {
return null;
}
d = df.parse(date);
} catch (Exception e) {
return null;
}
return d;
}
/**
* Metoda testuje, zda je v danem JComboBoxu vybrana nekjaka polozka.
*
* @param box instance tridy JComboBox
* @return true, pokud je vybrana nejaka polozka, jinak false
*/
public static boolean isSelectedItem(JComboBox box) {
if (box.getSelectedIndex() == -1) {
return false;
}
return true;
}
/**
* Metoda cisti textove pole pro datum - nastavuje aktualni datum.
*
* @param com instance tridy JTextComponent nebo jejich potomku
*/
public static void clearDateField(JTextComponent com) {
com.setText(df.format(new Date()));
}
/**
* Metoda cisti textove pole.
*
* @param com instance tridy JTextComponent nebo jejich potomku
*/
public static void clearTextField(JTextComponent com) {
com.setText("");
}
/**
* Metoda nastavuje jako vybranou polozku prvni item.
*
* @param box instance tridy JComboBox
*/
public static void clearComboBox(JComboBox box) {
if (box.getItemCount() > 0) {
box.setSelectedIndex(0);
}
}
}