package fi.utu.ville.exercises.layout; import java.util.HashSet; import java.util.Set; import com.vaadin.event.ShortcutAction.KeyCode; import com.vaadin.server.Page; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.CssLayout; import fi.utu.ville.standardutils.Localizer; import fi.utu.ville.standardutils.StandardIcon.Icon; import fi.utu.ville.standardutils.StandardUIFactory; import fi.utu.ville.standardutils.UIConstants; public class PhasedAssignmentNavigation extends CssLayout { private final Button prevButton, checkButton, nextButton; private final Set<ClickListener> prevButtonListeners = new HashSet<>(); private final Set<ClickListener> checkButtonListeners = new HashSet<>(); private final Set<ClickListener> nextButtonListeners = new HashSet<>(); public PhasedAssignmentNavigation(Localizer localizer) { this(localizer, false); } public PhasedAssignmentNavigation(Localizer localizer, boolean showPrevButton) { if (Page.getCurrent().getWebBrowser().isTouchDevice()) { String postfix = "_SHORT"; prevButton = new Button(Icon.MATH_PREV.getHtml() + "</br>" + localizer.getUIText(UIConstants.MATH_PREV + postfix)); prevButton.setHtmlContentAllowed(true); checkButton = new Button(Icon.MATH_CHECK.getHtml() + "</br>" + localizer.getUIText(UIConstants.MATH_CHECK + postfix)); checkButton.setHtmlContentAllowed(true); nextButton = new Button(Icon.MATH_NEXT.getHtml() + "</br>" + localizer.getUIText(UIConstants.MATH_NEXT + postfix)); nextButton.setHtmlContentAllowed(true); } else { prevButton = StandardUIFactory.getButton( localizer.getUIText(UIConstants.MATH_PREV), Icon.MATH_PREV); checkButton = StandardUIFactory.getButton( localizer.getUIText(UIConstants.MATH_CHECK), Icon.MATH_CHECK); nextButton = StandardUIFactory.getButton( localizer.getUIText(UIConstants.MATH_NEXT), Icon.MATH_NEXT); } prevButton.addClickListener(e -> runPrevButtonListeners(e)); checkButton.addClickListener(e -> runCheckButtonListeners(e)); nextButton.addClickListener(e -> runNextButtonListeners(e)); setPrevButtonVisible(showPrevButton); addComponents(prevButton, checkButton, nextButton); setStyleName("phased-assig-nav-bar"); if (Page.getCurrent().getWebBrowser().isTouchDevice()) { addStyleName("mobile"); } } public void setPrevButtonVisible(boolean visible) { prevButton.setVisible(visible); } public boolean isPrevButtonVisible() { return prevButton.isVisible(); } public void setPrevButtonEnabled(boolean enabled) { prevButton.setEnabled(enabled); } public void setCheckButtonVisible(boolean visible) { checkButton.setVisible(visible); } public boolean isCheckButtonVisible() { return checkButton.isVisible(); } public void setCheckButtonEnabled(boolean enabled) { checkButton.setEnabled(enabled); } public void setNextButtonEnabled(boolean enabled) { nextButton.setEnabled(enabled); } public void focusPrev() { focusButton(prevButton); } public void focusCheck() { focusButton(checkButton); } public void focusNext() { focusButton(nextButton); } private void focusButton(Button b) { prevButton.removeClickShortcut(); checkButton.removeClickShortcut(); nextButton.removeClickShortcut(); b.setClickShortcut(KeyCode.ENTER); b.focus(); } public void removeClickShortcuts() { prevButton.removeClickShortcut(); checkButton.removeClickShortcut(); nextButton.removeClickShortcut(); } /** * Returns the check button, needed to keep backwards compatibility with MathLayout * * @return Check button */ public Button getCheckButton() { return checkButton; } public void addPrevButtonListener(ClickListener l) { prevButtonListeners.add(l); } public void addCheckButtonListener(ClickListener l) { checkButtonListeners.add(l); } public void addNextButtonListener(ClickListener l) { nextButtonListeners.add(l); } private void runPrevButtonListeners(ClickEvent e) { prevButtonListeners.forEach(l -> l.buttonClick(e)); } private void runCheckButtonListeners(ClickEvent e) { checkButtonListeners.forEach(l -> l.buttonClick(e)); } private void runNextButtonListeners(ClickEvent e) { nextButtonListeners.forEach(l -> l.buttonClick(e)); } }