package au.com.vaadinutils.help; import org.vaadin.sliderpanel.SliderPanel; import org.vaadin.sliderpanel.SliderPanelBuilder; import org.vaadin.sliderpanel.SliderPanelStyles; import org.vaadin.sliderpanel.client.SliderMode; import org.vaadin.sliderpanel.client.SliderPanelListener; import org.vaadin.sliderpanel.client.SliderTabPosition; import com.vaadin.navigator.View; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.Page; import com.vaadin.server.Page.BrowserWindowResizeEvent; import com.vaadin.server.Page.BrowserWindowResizeListener; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.Reindeer; import au.com.vaadinutils.errorHandling.ErrorWindow; import au.com.vaadinutils.user.UserSettingsStorage; import au.com.vaadinutils.user.UserSettingsStorageFactory; public class HelpSplitPanel extends HorizontalLayout implements View, HelpPageListener { /** * */ private static final long serialVersionUID = 5011140025383708388L; private Panel helpPane; private VerticalLayout helpHolder = new VerticalLayout(); HelpIndex index = HelpIndexFactory.getHelpIndex(); View component; private Enum<?> currentHelpId; private Button hideButton; UserSettingsStorage userSettings = UserSettingsStorageFactory.getUserSettingsStorage(); private SliderPanel helpSliderPanel; public View getActiveView() { return component; } public HelpSplitPanel(View component) { super(); this.component = component; if (component instanceof HelpPageListenerMinimal) { ((HelpPageListenerMinimal) component).setHelpPageListener(this); } setImmediate(true); buildMainLayout(); setSizeFull(); ((Component) component).setSizeFull(); Enum<?> helpId = ((HelpProvider) component).getHelpId(); setHelpPageId(helpId); this.setImmediate(true); } public View getView() { return component; } boolean helpHiding = false; private VerticalLayout innerSecondPanel; @Override public void enter(ViewChangeEvent event) { // allow the View we are wrapping to process the enter event in the // normal way try { component.enter(event); } catch (Exception e) { ErrorWindow.showErrorWindow(e); } } public void setHelpPageId(Enum<?> helpId) { setHelp(helpId); } private void buildMainLayout() { addComponent((Component) component); setExpandRatio((Component) component, 1); helpPane = new Panel(); helpPane.setImmediate(false); showHelpLoadingSplash(); helpSliderPanel = new SliderPanelBuilder(helpPane).expanded(false).mode(SliderMode.RIGHT) .tabPosition(SliderTabPosition.MIDDLE).style(SliderPanelStyles.COLOR_BLUE).caption("Help") .animationDuration(400).tabSize(30).autoCollapseSlider(true) .fixedContentSize((int) (UI.getCurrent().getPage().getBrowserWindowWidth() * 0.75)).build(); helpLoader = new SlideOutLoader(); innerSecondPanel = new VerticalLayout(); innerSecondPanel.setSizeFull(); innerSecondPanel.setWidth("30"); innerSecondPanel.addComponent(helpSliderPanel); innerSecondPanel.setComponentAlignment(helpSliderPanel, Alignment.MIDDLE_RIGHT); addComponent(innerSecondPanel); Page.getCurrent().addBrowserWindowResizeListener(new BrowserWindowResizeListener() { private static final long serialVersionUID = -8548907013566961812L; @Override public void browserWindowResized(BrowserWindowResizeEvent event) { helpSliderPanel.setFixedContentSize((int) (event.getWidth() * 0.75)); if (helpSliderPanel.isExpanded()) { helpSliderPanel.collapse(); } } }); } private void showHelpLoadingSplash() { VerticalLayout splashHolder = new VerticalLayout(); splashHolder.setSizeFull(); Label splashLabel = new Label("<h2><br><br><b><center>Loading help, Please wait...<b>", ContentMode.HTML); splashHolder.addComponent(splashLabel); splashHolder.setComponentAlignment(splashLabel, Alignment.MIDDLE_RIGHT); helpPane.setContent(splashHolder); helpPane.setSizeFull(); } private void resizeHelp() { helpPane.setSizeFull(); helpHolder.setSizeFull(); } @Override public void removeAllComponents() { throw new RuntimeException("Cant remove compoents this way"); } @Override public void removeComponent(Component component) { throw new RuntimeException("Cant remove compoents this way"); } boolean showHelpOnPage = false; interface HelpLoader { void showHelp(final Enum<?> helpId, VerticalLayout helpHolder, HelpDisplayedCallback callback); } HelpLoader helpLoader; class SlideOutLoader implements HelpLoader { boolean loaded = false; private Enum<?> helpId; private HelpDisplayedCallback callback; SlideOutLoader() { helpSliderPanel.addListener(new SliderPanelListener() { @Override public void onToggle(boolean expand) { if (expand && !loaded) { if (helpId != null && callback != null) { index.setHelpSource(helpId, helpHolder, callback); loaded = true; } } } }); } @Override public void showHelp(Enum<?> helpId, VerticalLayout helpHolder, HelpDisplayedCallback callback) { loaded = false; this.helpId = helpId; this.callback = callback; if (helpSliderPanel.isExpanded()) { index.setHelpSource(helpId, helpHolder, callback); loaded = true; } } } class OnLayoutLoader implements HelpLoader { @Override public void showHelp(Enum<?> helpId, VerticalLayout helpHolder, HelpDisplayedCallback callback) { index.setHelpSource(helpId, helpHolder, callback); } } @Override public void setHelp(final Enum<?> helpId) { currentHelpId = helpId; helpHolder = new VerticalLayout(); helpHolder.setMargin(true); helpLoader.showHelp(helpId, helpHolder, new HelpDisplayedCallback() { @Override public void success() { helpPane.setContent(helpHolder); addFooter(); resizeHelp(); } @Override public void fail() { helpPane.setContent(helpHolder); addFooter(); resizeHelp(); } private void addFooter() { hideButton = new Button("Show Help On Page"); hideButton.setStyleName(Reindeer.BUTTON_SMALL); hideButton.addClickListener(new ClickListener() { private static final long serialVersionUID = -521965129353754937L; @Override public void buttonClick(ClickEvent event) { showHelpOnPage(); } }); HorizontalLayout helpFooter = new HorizontalLayout(); helpFooter.setWidth("100%"); helpFooter.setSpacing(true); if (!showHelpOnPage) { Button closeButton = new Button("Close"); closeButton.addClickListener(new ClickListener() { private static final long serialVersionUID = 8822575654757513760L; @Override public void buttonClick(ClickEvent event) { if (helpSliderPanel != null) { helpSliderPanel.collapse(); } } }); helpFooter.addComponent(closeButton); helpFooter.setComponentAlignment(closeButton, Alignment.BOTTOM_LEFT); helpFooter.addComponent(hideButton); helpFooter.addComponent(new Label("Help id is " + helpId)); helpFooter.setComponentAlignment(hideButton, Alignment.BOTTOM_RIGHT); closeButton.setStyleName(Reindeer.BUTTON_SMALL); } helpHolder.addComponent(helpFooter); helpHolder.setComponentAlignment(helpFooter, Alignment.BOTTOM_LEFT); // helpPane.setExpandRatio(helpLabel, .1f); } @Override public void showHelpLoadingSplash() { HelpSplitPanel.this.showHelpLoadingSplash(); } }); } @Override public void setHelpPageListener(HelpPageListener helpSplitPanel) { throw new RuntimeException( "This is the top level HelpPageListenerMinimal, you cant set the HelpPageListenerMinimal"); } @Override public void showHelpOnPage() { helpLoader = new OnLayoutLoader(); showHelpOnLayout(innerSecondPanel); innerSecondPanel.setWidth("" + (UI.getCurrent().getPage().getBrowserWindowWidth() * 0.5)); } @Override public void showHelpOnLayout(VerticalLayout layout) { helpLoader = new OnLayoutLoader(); // innerSecondPanel.removeComponent(helpPane); final VerticalLayout content = new VerticalLayout(new Label("Help is current displayed on the page")); content.setMargin(true); helpSliderPanel.setContent(content); helpSliderPanel.setVisible(false); layout.addComponent(helpPane); showHelpOnPage = true; setHelpPageId(currentHelpId); resizeHelp(); } @Override public void resetHelpPosition() { helpLoader = new SlideOutLoader(); innerSecondPanel.setWidth("30"); helpSliderPanel.setContent(helpPane); helpSliderPanel.setVisible(true); showHelpOnPage = false; setHelpPageId(currentHelpId); resizeHelp(); } }