package editor.gui;
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.WindowStateListener;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map.Entry;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import editor.App;
import editor.actions.Action;
import editor.actions.ClientAction;
import editor.actions.CloseAction;
import editor.actions.CutAction;
import editor.actions.DocumentAction;
import editor.actions.EstimateAction;
import editor.actions.ExitAction;
import editor.actions.ExportAction;
import editor.actions.HelpAction;
import editor.actions.ImportAction;
import editor.actions.InfoAction;
import editor.actions.InvoiceAction;
import editor.actions.OpenAction;
import editor.actions.OptionAction;
import editor.actions.PrintAction;
import editor.actions.SaveAction;
import editor.actions.SearchAction;
import editor.actions.ShortcutAction;
import editor.actions.ToolBarAction;
import editor.enums.ClientMenu;
import editor.enums.EditMenu;
import editor.enums.FileMenu;
import editor.enums.HelpMenu;
import editor.enums.MenuEntry;
import editor.enums.OptionMenu;
import editor.gui.components.ClientPanel;
import editor.gui.components.GuiComponent;
import editor.gui.components.InfoPanel;
import editor.gui.components.OptionPanel;
import editor.gui.components.SearchPanel;
import editor.gui.components.ShortcutPanel;
public class Gui{
// properties
private int x;
private int y;
private int width;
private int height;
private int state;
private boolean isFloatable;
// gui
private JFrame frame;
private JMenuBar menuBar;
private JToolBar toolBar;
private JTabbedPane tabbedPane;
// map's
private HashMap<String , GuiComponent> componentMap;
private HashMap<String , Action> actionMap;
private HashMap<String , Image> imageMap;
public Gui(){
try {
loadResources();
init();
initActions();
initComponents();
addListener();
addComponents();
}
catch (NullPointerException | IOException | IllegalArgumentException e) {
e.printStackTrace();
}
}
private void init(){
frame = new JFrame(App.TITLE + " " + App.VERSION);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setMinimumSize(App.DIMENSION);
}
private void saveProperties(){
// window
int state = frame.getExtendedState();
if(state == JFrame.MAXIMIZED_BOTH) {
App.PREFS.putInt("state", state);
}
else{
Rectangle bounds = frame.getBounds();
App.PREFS.putInt("xPos", bounds.x);
App.PREFS.putInt("yPos", bounds.y);
App.PREFS.putInt("width", bounds.width);
App.PREFS.putInt("height", bounds.height);
App.PREFS.putInt("state", state);
}
// toolbar
App.PREFS.putBoolean("toolbar", toolBar.isFloatable());
}
private void loadProperties(){
x = App.PREFS.getInt("xPos", 0);
y = App.PREFS.getInt("yPos", 0);
width = App.PREFS.getInt("width", App.WIDTH);
height = App.PREFS.getInt("height", App.HEIGHT);
state = App.PREFS.getInt("state", JFrame.NORMAL);
isFloatable = App.PREFS.getBoolean("toolbar", true);
}
private void restoreGui(){
frame.setBounds(x, y, width, height);
toolBar.setFloatable(isFloatable);
}
// RESOURCES
private void loadResources() throws IOException{
imageMap = new HashMap<>();
imageMap.put("new", ImageIO.read(getClass().getResourceAsStream("/images/newFile_small.png")));
imageMap.put("open", ImageIO.read(getClass().getResourceAsStream("/images/file_small.png")));
imageMap.put("close", ImageIO.read(getClass().getResourceAsStream("/images/close_small.png")));
imageMap.put("save", ImageIO.read(getClass().getResourceAsStream("/images/save_small.png")));
imageMap.put("search", ImageIO.read(getClass().getResourceAsStream("/images/search_small.png")));
imageMap.put("client", ImageIO.read(getClass().getResourceAsStream("/images/client_small.png")));
imageMap.put("option", ImageIO.read(getClass().getResourceAsStream("/images/options_small.png")));
imageMap.put("help", ImageIO.read(getClass().getResourceAsStream("/images/help_small.png")));
imageMap.put("toolbar", ImageIO.read(getClass().getResourceAsStream("/images/toolbar_small.png")));
imageMap.put("locked", ImageIO.read(getClass().getResourceAsStream("/images/toolbar_fixed_small.png")));
imageMap.put("cut", ImageIO.read(getClass().getResourceAsStream("/images/cut_small.png")));
imageMap.put("print", ImageIO.read(getClass().getResourceAsStream("/images/print_small.png")));
}
// ACTIONS
private void initActions() throws IOException{
actionMap = new HashMap<>();
actionMap.put("document", new DocumentAction(this, new ImageIcon(imageMap.get("new"))));
actionMap.put("invoice", new InvoiceAction(this, null));
actionMap.put("estimate", new EstimateAction(this, null));
actionMap.put("open", new OpenAction(this, new ImageIcon(imageMap.get("open"))));
actionMap.put("close", new CloseAction(this, new ImageIcon(imageMap.get("close"))));
actionMap.put("print", new PrintAction(this, new ImageIcon(imageMap.get("print"))));
actionMap.put("save", new SaveAction(this, new ImageIcon(imageMap.get("save"))));
actionMap.put("import", new ImportAction(this, null));
actionMap.put("export", new ExportAction(this, null));
actionMap.put("exit", new ExitAction(this, null));
actionMap.put("info", new InfoAction(this, null));
actionMap.put("shortcuts", new ShortcutAction(this, null));
actionMap.put("search", new SearchAction(this, new ImageIcon(imageMap.get("search"))));
actionMap.put("client", new ClientAction(this, new ImageIcon(imageMap.get("client"))));
actionMap.put("options", new OptionAction(this, new ImageIcon(imageMap.get("option"))));
actionMap.put("help", new HelpAction(this, new ImageIcon(imageMap.get("help"))));
actionMap.put("toolbar", new ToolBarAction(this, new ImageIcon(imageMap.get("toolbar"))));
actionMap.put("cut", new CutAction(this, new ImageIcon(imageMap.get("cut"))));
}
private void initComponents() throws IOException, NullPointerException, IllegalArgumentException{
tabbedPane = createTabbedPane();
menuBar = createMenuBar();
toolBar = createToolBar();
componentMap = new HashMap<>();
componentMap.put("client", new ClientPanel(this));
componentMap.put("info", new InfoPanel(this));
componentMap.put("option", new OptionPanel(this));
componentMap.put("search", new SearchPanel(this));
componentMap.put("shortcuts", new ShortcutPanel(this));
}
// WORKBENCH
private JTabbedPane createTabbedPane(){
JTabbedPane pane = new JTabbedPane();
return pane;
}
// JMENUBAR
private JMenuBar createMenuBar(){
JMenuBar bar = new JMenuBar();
JMenu fileMenu = new JMenu(MenuEntry.FILE.value());
JMenu editMenu = new JMenu(MenuEntry.EDIT.value());
JMenu optionMenu = new JMenu(MenuEntry.OPTIONS.value());
JMenu clientMenu = new JMenu(MenuEntry.CLIENTS.value());
JMenu helpMenu = new JMenu(MenuEntry.HELP.value());
fileMenu.setMnemonic(KeyEvent.VK_D);
editMenu.setMnemonic(KeyEvent.VK_B);
optionMenu.setMnemonic(KeyEvent.VK_E);
clientMenu.setMnemonic(KeyEvent.VK_K);
helpMenu.setMnemonic(KeyEvent.VK_H);
// FileMenu
JMenu fileSubMenu = new JMenu(FileMenu.NEW.value());
JMenuItem invoice = new JMenuItem(actionMap.get("invoice"));
JMenuItem estimate = new JMenuItem(actionMap.get("estimate"));
addMenuItems(fileSubMenu, invoice, estimate);
JMenuItem open = new JMenuItem(actionMap.get("open"));
JMenuItem close = new JMenuItem(actionMap.get("close"));
JMenuItem print = new JMenuItem(actionMap.get("print"));
JMenuItem save = new JMenuItem(actionMap.get("save"));
JMenuItem importData = new JMenuItem(actionMap.get("import"));
JMenuItem exportData = new JMenuItem(actionMap.get("export"));
JMenuItem exit = new JMenuItem(actionMap.get("exit"));
addMenuItems(fileMenu, fileSubMenu, new JSeparator(), open, close, save, new JSeparator());
addMenuItems(fileMenu, print, new JSeparator(), importData, exportData, new JSeparator(), exit);
// EditMenu
JMenuItem cut = new JMenuItem(actionMap.get("cut"));
JMenuItem copy = new JMenuItem(EditMenu.COPY.value());
JMenuItem paste = new JMenuItem(EditMenu.PASTE.value());
JMenuItem delete = new JMenuItem(EditMenu.DELETE.value());
JMenuItem search = new JMenuItem(actionMap.get("search"));
JMenuItem sort = new JMenuItem(EditMenu.SORT.value());
addMenuItems(editMenu, cut, copy, paste, new JSeparator());
addMenuItems(editMenu, delete, search, sort);
// OptionMenu
JMenu display = new JMenu(OptionMenu.DISPLAY.value());
JMenuItem small = new JMenuItem(OptionMenu.SMALL.value());
JMenuItem mid = new JMenuItem(OptionMenu.MID.value());
JMenuItem big = new JMenuItem(OptionMenu.BIG.value());
JMenuItem full = new JMenuItem(OptionMenu.FULL.value());
addMenuItems(display, small, mid, big, full);
JMenuItem user = new JMenuItem(OptionMenu.USER.value());
JMenuItem options = new JMenuItem(actionMap.get("options"));
addMenuItems(optionMenu, display, new JSeparator(), user, options);
// ClientMenu
JMenuItem clientMaintenance = new JMenuItem(actionMap.get("client"));
JMenuItem saveClient = new JMenuItem(ClientMenu.SAVE.value());
addMenuItems(clientMenu, clientMaintenance, new JSeparator(), saveClient);
// HelpMenu
JMenuItem shortcuts = new JMenuItem(actionMap.get("shortcuts"));
JMenuItem about = new JMenuItem(actionMap.get("info"));
JMenuItem contact = new JMenuItem(HelpMenu.CONTACT.value());
JMenuItem docu = new JMenuItem(HelpMenu.DOCU.value());
JMenuItem errorlog = new JMenuItem(HelpMenu.ERRORLOG.value());
JMenuItem update = new JMenuItem(HelpMenu.UPDATE.value());
addMenuItems(helpMenu, shortcuts,new JSeparator(), about, contact);
addMenuItems(helpMenu, new JSeparator(), docu, errorlog, update);
bar.add(fileMenu);
bar.add(editMenu);
bar.add(optionMenu);
bar.add(clientMenu);
bar.add(helpMenu);
return bar;
}
private void addMenuItems(JMenu menu, JComponent...components){
for (JComponent component : components) {
menu.add(component);
}
}
// JTOOLBAR
private JToolBar createToolBar(){
JToolBar bar = new JToolBar();
JButton[] btns = new JButton[9];
for (int i = 0; i < btns.length; i++) {
btns[i] = new JButton();
btns[i].setHideActionText(true);
}
btns[0].setAction(actionMap.get("document"));
btns[1].setAction(actionMap.get("open"));
btns[2].setAction(actionMap.get("close"));
btns[3].setAction(actionMap.get("search"));
btns[4].setAction(actionMap.get("save"));
btns[5].setAction(actionMap.get("client"));
btns[6].setAction(actionMap.get("print"));
btns[7].setAction(actionMap.get("options"));
btns[8].setAction(actionMap.get("help"));
bar.add(btns[0]);
bar.add(btns[1]);
bar.add(btns[2]);
bar.addSeparator();
bar.add(btns[3]);
bar.add(btns[4]);
bar.add(btns[5]);
bar.addSeparator();
bar.add(btns[6]);
bar.add(btns[7]);
bar.add(btns[8]);
return bar;
}
private void addListener(){
GuiListener listener = new GuiListener();
frame.addWindowListener(listener);
frame.addWindowStateListener(listener);
}
private void addComponents(){
frame.setJMenuBar(menuBar);
frame.add(BorderLayout.PAGE_START, toolBar);
frame.add(BorderLayout.CENTER, tabbedPane);
}
public void addTab(JComponent tab){
tabbedPane.add(tab, tab.getName());
}
public void removeTab(JComponent tab){
tabbedPane.remove(tab);
}
public void setVisible(){
frame.setVisible(true);
}
public void dispose(){
frame.dispose();
}
public void disposeAll(){
for(Entry<String, GuiComponent> entry : componentMap.entrySet()){
entry.getValue().dispose();
}
dispose();
}
public int countChilds() {return componentMap.size();}
public JFrame getFrame() {return frame;}
public JTabbedPane getTabbedPane() {return tabbedPane;}
public JToolBar getToolBar() {return toolBar;}
public JMenuBar getMenuBar() {return menuBar;}
public JComponent getSelectedTab() {return (JComponent)tabbedPane.getSelectedComponent();}
public GuiComponent getComponentByName(String name) {return componentMap.get(name);}
public Action getActionByName(String name) {return actionMap.get(name);}
public Image getImageByName(String name) {return imageMap.get(name);}
// INNER CLASS LISTENER
class GuiListener implements WindowListener, WindowStateListener{
@Override
public void windowOpened(WindowEvent e){
loadProperties();
if(state == JFrame.MAXIMIZED_BOTH) {
frame.setExtendedState(state);
}
else{
restoreGui();
}
}
@Override
public void windowClosing(WindowEvent e){
disposeAll();
}
@Override
public void windowClosed(WindowEvent e){
saveProperties();
}
@Override
public void windowIconified(WindowEvent e){}
@Override
public void windowDeiconified(WindowEvent e){}
@Override
public void windowActivated(WindowEvent e){}
@Override
public void windowDeactivated(WindowEvent e){}
@Override
public void windowStateChanged(WindowEvent e){
if(e.getNewState() == JFrame.NORMAL) {
restoreGui();
}
}
}
}