package cz.cvut.fel.restauracefel.storage.sklad_gui;
import cz.cvut.fel.restauracefel.hibernate.User;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.KeyStroke;
import cz.cvut.fel.restauracefel.library.service.Backup;
import cz.cvut.fel.restauracefel.library.service.ConfigParser;
import cz.cvut.fel.restauracefel.library.service.LocalizationManager;
import cz.cvut.fel.restauracefel.library.view.CommonViewController;
import cz.cvut.fel.restauracefel.storage.storageController.StorageController;
/**
* Hlavni trida grafickeho uzivatelskeho rozhrani. Stara se o vytvareni ostatnich
* trid (lazy inicialization), predavani rizeni temto tridam atd.
*
* @author Jarda
*/
public class MainFrame extends JFrame {
private LocalizationManager manager = LocalizationManager.getInstance();
private Container con = null;
private JMenuBar menuBar = null;
private JMenu menuFile = null;
private JMenu menuStore = null;
private JMenu zrcadlo = null;
private JMenu zalohovani = null;
private JMenu menuHelp = null;
private JMenuItem close = null;
private JMenuItem uzaverka = null;
private JMenuItem uzaverkaPrehled = null;
private JMenuItem newMaterial = null;
private JMenuItem insertMat = null;
private JMenuItem exportMat = null;
private JMenuItem deprecMat = null;
private JMenuItem matTypes = null;
private JMenuItem reasonTypes = null;
private JMenuItem about = null;
private JMenuItem vytvoritZalohu = null;
private JScrollPane panel = null;
private JScrollPane panelTable = null;
private static AbstractForm form = null;
private static MaterialForm materialForm = null;
private static NewUzaverkaForm uzaverkaForm = null;
private static NewUzaverkaList uzaverkaFormList = null;
private static IncomeForm insertMaterialForm = null;
private static ExpenditureForm expenditureForm = null;
private static DepreciationForm depreciationForm = null;
private static MaterialTypeDialog mtd = null;
private static ReasonTypeDialog rtd = null;
private static StatusBar statusBar = new StatusBar();
private static User loggedUser = null;
private final CommonViewController commonViewController;
private final MainFrame mainFrame;
public String[] rights = null;
/**
* Konstruktor tridy MainFrame.
*/
public MainFrame() { //User user, String[] prava
commonViewController = CommonViewController.getInstance();
loggedUser = StorageController.getInstance().user; // TODO
rights = StorageController.getInstance().prava; // TODO
if (loggedUser == null) {
this.dispose();
}
manager.localizeFrame(StorageController.DEFAULT_BUNDLE_BASE_NAME, "MainFrame", this);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
initComponents();
mainFrame = this;
}
/**
* Metoda navraci referenci na instanci pro kterou byla zavolana.
*
* @return instance tridy JFrame
*/
private JFrame getThis() {
return this;
}
/**
* Metoda pro ukonceni cele aplikace.
*/
public void close() {
this.dispose();
}
/**
* Tato metoda vznikla kvuli zobrazovani UzaverkaForm, ktere se nekona v teto tride.
* Tuto metodu by mely (po upravach) vyuzivat i ostatni panely v teto tride. Dojde tim k vyraznemu zkraceni tridy.
* Vojtech Ruschka
* @param p
*/
public void addPanel(JPanel p) {
con.removeAll();
panel.getViewport().add(p);
con.add(panel, BorderLayout.NORTH);
//panelTable.getViewport().add(uzaverkaForm.getTable());
//con.add(panelTable, BorderLayout.CENTER);
con.add(statusBar, BorderLayout.SOUTH);
setVisible(true);
}
/**
* Tato metoda se stara o inicializaci a vytvoreni hlavniho menu (instance
* tridy JMenuBar). Pro jednotlive polozky menu (JMenuItem) jsou zde definovane
* posluchace (ActionListener).
*/
private void createMenu() {
menuBar = new JMenuBar();
menuFile = new JMenu("Soubor");
manager.localizeMenu(StorageController.DEFAULT_BUNDLE_BASE_NAME, "FileMenu", menuFile);
menuStore = new JMenu("Sklad");
manager.localizeMenu(StorageController.DEFAULT_BUNDLE_BASE_NAME, "StoreMenu", menuStore);
zrcadlo = new JMenu("Zrcadlo");
manager.localizeMenu(StorageController.DEFAULT_BUNDLE_BASE_NAME, "MirrorMenu", zrcadlo);
menuHelp = new JMenu("Nápověda");
manager.localizeMenu(StorageController.DEFAULT_BUNDLE_BASE_NAME, "HelpMenu", menuHelp);
zalohovani = new JMenu("Zálohování");
manager.localizeMenu(StorageController.DEFAULT_BUNDLE_BASE_NAME, "BackingMenu", zalohovani);
close = new JMenuItem("Konec aplikace");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "CloseMenuItem", close);
newMaterial = new JMenuItem("Skladové záznamy");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "NewMaterialMenuItem", newMaterial);
insertMat = new JMenuItem("Příjem surovin na sklad");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "InsertMaterialMenuItem", insertMat);
exportMat = new JMenuItem("Výdej surovin ze skladu");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "ExportMaterialMenuItem", exportMat);
deprecMat = new JMenuItem("Odpis surovin ze skladu");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "DepreciateMaterialMenuItem", deprecMat);
matTypes = new JMenuItem("Druhy surovin");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "MaterialTypesMenuItem", matTypes);
reasonTypes = new JMenuItem("Důvody odpisů surovin");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "ReasonTypesMenuItem", reasonTypes);
uzaverkaPrehled = new JMenuItem("Uzávěrky");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "BalancingMenuItem", uzaverkaPrehled);
vytvoritZalohu = new JMenuItem("Vytvořit zálohu dat");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "BackupMenuItem", vytvoritZalohu);
about = new JMenuItem("O aplikaci");
manager.localizeMenuItem(StorageController.DEFAULT_BUNDLE_BASE_NAME, "AboutMenuItem", about);
close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K, InputEvent.CTRL_MASK));
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int x = JOptionPane.showConfirmDialog(null, "Opravdu chcete ukončit běh programu?", "Konec", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (x == 0) {
close();
}
}
});
newMaterial.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
newMaterial.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!contains("Editace surovin")) {
if (!commonViewController.performBaseAdditionalLogin(mainFrame, "Editace surovin")) {
return;
}
}
try {
if (materialForm == null) {
materialForm = new MaterialForm(getThis(), statusBar);
} else {
materialForm.refresh();
}
} catch (FileNotFoundException fnfe) {
JOptionPane.showMessageDialog(null, "Konfigurační soubor \"" + ConfigParser.getConfigFile() + "\" nebyl nalezen.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Nelze navázat spojení se serverem.", "Chyba komunikace", JOptionPane.ERROR_MESSAGE);
return;
}
form = materialForm;
con.removeAll();
panel.getViewport().add(materialForm);
con.add(panel, BorderLayout.NORTH);
panelTable.getViewport().add(materialForm.getTable());
con.add(panelTable, BorderLayout.CENTER);
con.add(statusBar, BorderLayout.SOUTH);
setVisible(true);
}
});
insertMat.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, InputEvent.CTRL_MASK));
insertMat.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!contains("Příjem surovin")) {
if (!commonViewController.performBaseAdditionalLogin(mainFrame, "Příjem surovin")) {
return;
}
}
try {
if (insertMaterialForm == null) {
insertMaterialForm = new IncomeForm(getThis(), statusBar);
} else {
insertMaterialForm.refresh();
}
} catch (FileNotFoundException fnfe) {
JOptionPane.showMessageDialog(null, "Konfigurační soubor \"" + ConfigParser.getConfigFile() + "\" nebyl nalezen.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Nelze navázat spojení se serverem.", "Chyba komunikace", JOptionPane.ERROR_MESSAGE);
return;
}
form = insertMaterialForm;
con.removeAll();
panel.getViewport().add(insertMaterialForm);
con.add(panel, BorderLayout.NORTH);
panelTable.getViewport().add(insertMaterialForm.getTable());
con.add(panelTable, BorderLayout.CENTER);
con.add(statusBar, BorderLayout.SOUTH);
setVisible(true);
}
});
exportMat.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
exportMat.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!contains("Výdej surovin")) {
if (!commonViewController.performBaseAdditionalLogin(mainFrame, "Výdej surovin")) {
return;
}
}
try {
if (expenditureForm == null) {
expenditureForm = new ExpenditureForm(getThis(), statusBar);
} else {
expenditureForm.refresh();
}
} catch (FileNotFoundException fnfe) {
JOptionPane.showMessageDialog(null, "Konfigurační soubor \"" + ConfigParser.getConfigFile() + "\" nebyl nalezen.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Nelze navázat spojení se serverem.", "Chyba komunikace", JOptionPane.ERROR_MESSAGE);
return;
}
form = expenditureForm;
con.removeAll();
panel.getViewport().add(expenditureForm);
con.add(panel, BorderLayout.NORTH);
panelTable.getViewport().add(expenditureForm.getTable());
con.add(panelTable, BorderLayout.CENTER);
con.add(statusBar, BorderLayout.SOUTH);
setVisible(true);
}
});
deprecMat.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
deprecMat.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!contains("Odpis surovin")) {
if (!commonViewController.performBaseAdditionalLogin(mainFrame, "Odpis surovin")) {
return;
}
}
try {
if (depreciationForm == null) {
depreciationForm = new DepreciationForm(getThis(), statusBar);
} else {
depreciationForm.refresh();
}
} catch (FileNotFoundException fnfe) {
JOptionPane.showMessageDialog(null, "Konfigurační soubor \"" + ConfigParser.getConfigFile() + "\" nebyl nalezen.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Nelze navázat spojení se serverem.", "Chyba komunikace", JOptionPane.ERROR_MESSAGE);
return;
}
form = depreciationForm;
con.removeAll();
panel.getViewport().add(depreciationForm);
con.add(panel, BorderLayout.NORTH);
panelTable.getViewport().add(depreciationForm.getTable());
con.add(panelTable, BorderLayout.CENTER);
con.add(statusBar, BorderLayout.SOUTH);
setVisible(true);
}
});
matTypes.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_MASK));
matTypes.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!contains("Editace druhů surovin")) {
if (!commonViewController.performBaseAdditionalLogin(mainFrame, "Editace druhů surovin")) {
return;
}
}
try {
mtd = new MaterialTypeDialog(getThis(), true);
mtd.setVisible(true);
if (form != null) {
form.refresh();
}
} catch (FileNotFoundException fnfe) {
JOptionPane.showMessageDialog(null, "Konfigurační soubor \"" + ConfigParser.getConfigFile() + "\" nebyl nalezen.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Nelze navázat spojení se serverem.", "Chyba komunikace", JOptionPane.ERROR_MESSAGE);
return;
}
}
});
reasonTypes.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK));
reasonTypes.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!contains("Editace důvodů odpisu")) {
if (!commonViewController.performBaseAdditionalLogin(mainFrame, "Editace důvodů odpisu")) {
return;
}
}
try {
rtd = new ReasonTypeDialog(getThis(), true);
rtd.setVisible(true);
if (form != null) {
form.refresh();
}
} catch (FileNotFoundException fnfe) {
JOptionPane.showMessageDialog(null, "Konfigurační soubor \"" + ConfigParser.getConfigFile() + "\" nebyl nalezen.", "Chyba", JOptionPane.ERROR_MESSAGE);
return;
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Nelze navázat spojení se serverem.", "Chyba komunikace", JOptionPane.ERROR_MESSAGE);
return;
}
}
});
uzaverkaPrehled.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
uzaverkaPrehled.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (!contains("Přehled uzávěrek")) {
if (!commonViewController.performBaseAdditionalLogin(mainFrame, "Přehled uzávěrek")) {
return;
}
}
uzaverkaFormList = new NewUzaverkaList(getThis(), getLoggedUser());
try {
uzaverkaFormList.refresh();
} catch (FileNotFoundException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
} catch (NotBoundException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
} catch (RemoteException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
}
con.removeAll();
panel.getViewport().add(uzaverkaFormList);
con.add(panel, BorderLayout.NORTH);
// panelTable.getViewport().add(uzaverkaFormList.getTable());
//con.add(panelTable, BorderLayout.CENTER);
con.add(statusBar, BorderLayout.SOUTH);
setVisible(true);
}
});
about.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
about.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(getThis(), "Aplikace RestauraceFEL - Manažerský modul.", "O aplikaci", JOptionPane.INFORMATION_MESSAGE);
}
});
vytvoritZalohu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!contains("Zálohování dat")) {
if (!commonViewController.performBaseAdditionalLogin(mainFrame, "Zálohování dat")) {
return;
}
}
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
try {
fileChooser.setCurrentDirectory(new File(".").getCanonicalFile());
File backingUp = new File("../Server/db_rest_fel");
int val = fileChooser.showDialog(getThis(), "Vyber");
if (val == JFileChooser.APPROVE_OPTION) {
File where = fileChooser.getSelectedFile();
File dst = Backup.createRootFolder(backingUp, where);
Backup.copyDirectory(backingUp, dst);
JOptionPane.showMessageDialog(null, "Záloha byla vytvořena", "Záloha vytvořena", JOptionPane.INFORMATION_MESSAGE);
}
} catch (FileNotFoundException fnfe) {
JOptionPane.showMessageDialog(null, fnfe.getMessage(), "Chyba", JOptionPane.ERROR_MESSAGE);
return;
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Nelze navázat spojení se serverem.", "Chyba komunikace", JOptionPane.ERROR_MESSAGE);
return;
}
}
});
menuFile.add(close);
menuStore.add(newMaterial);
menuStore.add(insertMat);
menuStore.add(exportMat);
menuStore.add(deprecMat);
menuStore.add(new JSeparator());
menuStore.add(matTypes);
menuStore.add(reasonTypes);
menuHelp.add(about);
zrcadlo.add(uzaverkaPrehled);
zalohovani.add(vytvoritZalohu);
menuBar.add(menuFile);
menuBar.add(menuStore);
menuBar.add(zrcadlo);
menuBar.add(zalohovani);
menuBar.add(menuHelp);
this.setJMenuBar(menuBar);
//setRights();
}
public boolean contains(String name) {
if (rights == null) {
return false;
}
for (int i = 0; i < rights.length; i++) {
if (rights[i].equals(name)) {
return true;
}
}
return false;
}
/*public void setRights() {
if (!contains("Editace surovin")) {
newMaterial.setEnabled(false);
}
if (!contains("Příjem surovin")) {
insertMat.setEnabled(false);
}
if (!contains("Výdej surovin")) {
exportMat.setEnabled(false);
}
if (!contains("Odpis surovin")) {
deprecMat.setEnabled(false);
}
if (!contains("Editace druhů surovin")) {
matTypes.setEnabled(false);
}
if (!contains("Editace důvodů odpisu")) {
reasonTypes.setEnabled(false);
}
if (!contains("Tvorba uzávěrky (zrcadlo)")) {
//uzaverka.setEnabled(false);
}
if (!contains("Přehled uzávěrek")) {
uzaverkaPrehled.setEnabled(false);
}
if (!contains("Zálohování dat")) {
vytvoritZalohu.setEnabled(false);
}
}*/
/**
* Metoda inicializuje okno a jeho komponenty. Vola metodu pro vytvoreni
* hlavniho menu.
*/
private void initComponents() {
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
int w = 650;
int h = 550;
int y = (int) ((dim.getHeight() - h) / 2);
int x = (int) ((dim.getWidth() - w) / 2);
this.setBounds(x, y, w, h);
this.setVisible(true);
this.setMinimumSize(new Dimension(400, 400));
con = this.getContentPane();
con.setLayout(new BorderLayout());
panel = new JScrollPane();
panelTable = new JScrollPane();
this.createMenu();
}
/**
* Metoda navraci instanci tridy User prave prihlaseneho uzivatele.
*
* @return prihlaseny uzivatel
*/
public static User getLoggedUser() {
return loggedUser;
}
}