/**
* Sencha GXT 3.0.0b - Sencha for GWT
* Copyright(c) 2007-2012, Sencha, Inc.
* licensing@sencha.com
*
* http://www.sencha.com/products/gxt/license/
*/
package com.sencha.gxt.explorer.client.misc;
import java.util.HashMap;
import java.util.Map;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.autobean.shared.AutoBean;
import com.sencha.gxt.core.client.GXT;
import com.sencha.gxt.core.client.util.Rectangle;
import com.sencha.gxt.explorer.client.model.Example.Detail;
import com.sencha.gxt.state.client.AbstractStateHandler;
import com.sencha.gxt.state.client.BeforeRestoreStateEvent;
import com.sencha.gxt.state.client.BeforeRestoreStateEvent.BeforeRestoreStateHandler;
import com.sencha.gxt.state.client.CookieProvider;
import com.sencha.gxt.state.client.DefaultStateAutoBeanFactory;
import com.sencha.gxt.state.client.RestoreStateEvent;
import com.sencha.gxt.state.client.RestoreStateEvent.RestoreStateHandler;
import com.sencha.gxt.state.client.StateManager;
import com.sencha.gxt.widget.core.client.Window;
import com.sencha.gxt.widget.core.client.button.ButtonBar;
import com.sencha.gxt.widget.core.client.button.TextButton;
import com.sencha.gxt.widget.core.client.event.BeforeHideEvent;
import com.sencha.gxt.widget.core.client.event.BeforeHideEvent.BeforeHideHandler;
import com.sencha.gxt.widget.core.client.event.BeforeShowEvent;
import com.sencha.gxt.widget.core.client.event.BeforeShowEvent.BeforeShowHandler;
import com.sencha.gxt.widget.core.client.event.SelectEvent;
import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
import com.sencha.gxt.widget.core.client.info.Info;
@Detail(name = "Window State", icon = "helloworld", category = "Misc")
public class WindowStateExample implements IsWidget, EntryPoint {
/**
* We must extend <code>DefaultStateAutoBeanFactory</code> and then specify
* via the GWT module XML file this class.
*
* <code>
* <set-configuration-property name="GXT.state.autoBeanFactory"
* value="com.sencha.gxt.explorer.client.misc.StateExample.ExampleAutoBeanFactory" />
* </code>
*/
public interface ExampleAutoBeanFactory extends DefaultStateAutoBeanFactory {
AutoBean<WindowsState> windowsState();
AutoBean<WindowState> windowState();
}
public static interface WindowsState {
Map<String, WindowState> getWindowState();
void setWindowState(Map<String, WindowState> windowState);
}
public class StateExampleHandler extends AbstractStateHandler<WindowsState, WindowStateExample> {
public StateExampleHandler(WindowStateExample example, String key) {
super(WindowsState.class, example, key);
}
@Override
public void applyState() {
Map<String, WindowState> windows = getState().getWindowState();
if (windows == null) {
windows = new HashMap<String, WindowState>();
getState().setWindowState(windows);
}
}
}
public static interface WindowState {
int getHeight();
int getWidth();
int getX();
int getY();
void setHeight(int height);
void setWidth(int width);
void setX(int x);
void setY(int y);
}
private class Handler implements BeforeHideHandler, BeforeShowHandler,
BeforeRestoreStateHandler<WindowsState, WindowStateExample>,
RestoreStateHandler<WindowsState, WindowStateExample> {
@Override
public void onBeforeHide(BeforeHideEvent event) {
onBeforeHideWindow((Window) event.getSource());
}
@Override
public void onBeforeShow(BeforeShowEvent event) {
onBeforeShowWindow((Window) event.getSource());
}
@Override
public void onBeforeRestoreState(BeforeRestoreStateEvent<WindowsState, WindowStateExample> event) {
Info.display("State Change", "Before restore state");
}
@Override
public void onRestoreState(RestoreStateEvent<WindowsState, WindowStateExample> event) {
Info.display("State Change", "Restore state");
}
}
private ExampleAutoBeanFactory factory = GWT.create(ExampleAutoBeanFactory.class);
private StateExampleHandler stateHandler;
private Handler handler = new Handler();
@Override
public Widget asWidget() {
stateHandler = new StateExampleHandler(this, "stateExample");
stateHandler.addBeforeRestoreStateHandler(handler);
stateHandler.loadState();
VerticalPanel vp = new VerticalPanel();
vp.setSpacing(10);
vp.add(new HTML(
"<span style='font-size: 12px'>This examples saves the windows size and position when closed. State is restored when opening window in a new session.</span>"));
ButtonBar bar = new ButtonBar();
for (int i = 0; i < 5; i++) {
final Window w = createWindow(i + 1);
bar.add(new TextButton("Window " + (i + 1), new SelectHandler() {
@Override
public void onSelect(SelectEvent event) {
w.show();
}
}));
}
vp.add(bar);
return vp;
}
@Override
public void onModuleLoad() {
StateManager.get().setProvider(new CookieProvider("/", null, null, GXT.isSecure()));
RootPanel.get().add(asWidget());
}
private Window createWindow(int index) {
Window w = new Window();
w.setHeadingText("Window " + index);
w.addBeforeHideHandler(handler);
w.addBeforeShowHandler(handler);
w.setStateId("stateExampleWindow" + index);
return w;
}
private void onBeforeHideWindow(Window window) {
String stateId = window.getStateId();
WindowsState state = stateHandler.getState();
Map<String, WindowState> windows = state.getWindowState();
WindowState windowState = windows.get(stateId);
if (windowState == null) {
windowState = factory.windowState().as();
windows.put(stateId, windowState);
}
Rectangle rect = window.getElement().getBounds();
windowState.setHeight(rect.getHeight());
windowState.setWidth(rect.getWidth());
windowState.setX(rect.getX());
windowState.setY(rect.getY());
stateHandler.saveState();
}
private void onBeforeShowWindow(Window window) {
if (stateHandler.getState() != null && stateHandler.getState().getWindowState() != null) {
String stateId = window.getStateId();
WindowState state = stateHandler.getState().getWindowState().get(stateId);
if (state != null) {
window.setPixelSize(state.getWidth(), state.getHeight());
window.setPagePosition(state.getX(), state.getY());
}
}
}
}