package edu.gui; import edu.exceptions.GuiException; import edu.gui.components.Page; import edu.parser.QL.nodes.question.Question; import edu.parser.QLS.nodes.Section; import javax.swing.*; import java.awt.*; import java.util.List; /** * Created by Steven Kok on 24/02/2015. */ public class MainWindow extends JFrame { private final JPanel mainPanel; private final JPanel questionPanel; private final JPanel paginationPanel; private int totalPages = 0; private int currentPage = 1; private JButton nextButton; private JButton backButton; private final Observer questionState; private CardLayout cardLayout; public MainWindow(Observer questionState) { mainPanel = new JPanel(); questionPanel = new JPanel(); paginationPanel = new JPanel(); this.questionState = questionState; cardLayout = new CardLayout(10, 10); } public void initialize() { resetToDefaultState(); mainPanel.setLayout(new BorderLayout()); questionPanel.setLayout(cardLayout); mainPanel.add(questionPanel, BorderLayout.CENTER); mainPanel.add(paginationPanel, BorderLayout.PAGE_END); add(mainPanel); addPaginationButtons(); } private void resetToDefaultState() { mainPanel.removeAll(); questionPanel.removeAll(); resetPagination(); } private void resetPagination() { totalPages = 0; paginationPanel.removeAll(); } private void addPaginationButtons() { nextButton = new JButton("Next"); nextButton.addActionListener(e -> nextPage()); backButton = new JButton("Back"); backButton.setVisible(false); backButton.addActionListener(e -> previousPage()); paginationPanel.add(backButton); paginationPanel.add(nextButton); } public void nextPage() { goToSpecificPage(currentPage + 1); } private void previousPage() { goToSpecificPage(currentPage - 1); } public int getCurrentPage() { return currentPage; } public void goToSpecificPage(int pageNumber) { if (isInvalidPageNumber(pageNumber)) { throw new GuiException(String.format("Cannot switch to page. total pages: [%d] page: [%d]", totalPages, pageNumber)); } else { jumpToPage(pageNumber); if (atFirstPage()) { backButton.setVisible(false); } else { backButton.setVisible(true); } if (atLastPage()) { nextButton.setVisible(false); } else { nextButton.setVisible(true); } } } private void jumpToPage(int pageNumber) { currentPage = pageNumber; cardLayout.show(questionPanel, String.valueOf(pageNumber)); } private boolean isInvalidPageNumber(int pageNumber) { return pageNumber > totalPages || currentPage < 1; } private boolean atLastPage() { return currentPage >= totalPages; } private boolean atFirstPage() { return currentPage <= 1; } public void showMainWindow() { setTitle("Main window"); pack(); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setLocationRelativeTo(null); setVisible(true); } public void addPage(List<Section> sections, List<Question> questions) { Page page = new Page(sections, questions, questionState); questionPanel.add(page, String.valueOf(++totalPages)); } }