package com.vaadin.tests.navigator;
import com.vaadin.navigator.Navigator;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractReindeerTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class NavigatorViewBlocksBackButtonAction
extends AbstractReindeerTestUI {
private Navigator navigator;
protected static final String LABEL_MAINVIEW_ID = "LABEL_MAINVIEW_ID";
protected static final String LABEL_PROMPTEDVIEW_ID = "LABEL_PROMPTEDVIEW_ID";
@Override
protected void setup(VaadinRequest request) {
navigator = new Navigator(this, this);
navigator.addView(MainView.NAME, new MainView());
navigator.addView(ViewWithPromptedLeave.NAME,
new ViewWithPromptedLeave());
navigator.navigateTo(MainView.NAME);
}
class MainView extends VerticalLayout implements View {
public static final String NAME = "mainview";
public MainView() {
Label label = new Label("MainView content");
label.setId(LABEL_MAINVIEW_ID);
addComponent(label);
Button buttonNavToAnotherView = new Button(
"Navigate to another view", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
navigator.navigateTo(ViewWithPromptedLeave.NAME);
}
});
addComponent(buttonNavToAnotherView);
}
@Override
public void enter(ViewChangeEvent event) {
}
}
class ViewWithPromptedLeave extends VerticalLayout
implements View, ViewChangeListener {
public static final String NAME = "prompted";
protected boolean okToLeave;
public ViewWithPromptedLeave() {
Label label = new Label("ViewWithPromptedLeave content");
label.setId(LABEL_PROMPTEDVIEW_ID);
addComponent(label);
addComponent(new Label(
"Try to navigate back to first view with browser back button."));
}
@Override
public void enter(ViewChangeEvent event) {
event.getNavigator().addViewChangeListener(this);
}
@Override
public boolean beforeViewChange(final ViewChangeEvent event) {
if (okToLeave) {
okToLeave = false;
return true;
} else {
final Window confirmationWindow = new Window("Confirm");
confirmationWindow.setModal(true);
confirmationWindow.setClosable(true);
VerticalLayout confirmationWindowLayout = new VerticalLayout();
confirmationWindow.setContent(confirmationWindowLayout);
confirmationWindowLayout.setMargin(true);
confirmationWindowLayout.setSpacing(true);
confirmationWindowLayout
.addComponent(new Label("Really exit this view?"));
confirmationWindowLayout.addComponent(
new Button("Yeah, sure!", new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent buttonEvent) {
okToLeave = true;
getUI().removeWindow(confirmationWindow);
event.getNavigator()
.navigateTo(event.getViewName() + "/"
+ event.getParameters());
}
}));
getUI().addWindow(confirmationWindow);
return false;
}
}
@Override
public void afterViewChange(ViewChangeEvent event) {
if (event.getNewView() != this) {
event.getNavigator().removeViewChangeListener(this);
}
}
}
@Override
protected String getTestDescription() {
return "URL should not be changed when view blocks navigating away from view using the browser's Back-button";
}
@Override
protected Integer getTicketNumber() {
return 10901;
}
}