/******************************************************************************* * Copyright (c) 2009 EclipseSource and others. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * EclipseSource - initial API and implementation * Ralf Zahn (ARS) - browser history support (Bug 283291) ******************************************************************************/ package org.eclipse.rwt.internal.widgets; import java.text.MessageFormat; import javax.servlet.http.HttpServletRequest; import org.eclipse.rwt.*; import org.eclipse.rwt.events.BrowserHistoryEvent; import org.eclipse.rwt.events.BrowserHistoryListener; import org.eclipse.rwt.internal.AdapterManagerImpl; import org.eclipse.rwt.internal.events.*; import org.eclipse.rwt.internal.lifecycle.*; import org.eclipse.rwt.internal.service.ContextProvider; import org.eclipse.rwt.internal.util.EncodingUtil; import org.eclipse.rwt.lifecycle.*; import org.eclipse.rwt.service.SessionStoreEvent; import org.eclipse.rwt.service.SessionStoreListener; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; public final class BrowserHistory implements IBrowserHistory, PhaseListener, Adaptable, SessionStoreListener { private static final long serialVersionUID = 1L; private static final String EVENT_HISTORY_NAVIGATED = "org.eclipse.rwt.events.historyNavigated"; private static final String EVENT_HISTORY_NAVIGATED_ENTRY_ID = "org.eclipse.rwt.events.historyNavigated.entryId"; private static final String ADD_TO_HISTORY = "qx.client.History.getInstance().addToHistory( {0}, {1} );"; private final Display display; private IEventAdapter eventAdapter; public BrowserHistory() { this.display = Display.getCurrent(); LifeCycleFactory.getLifeCycle().addPhaseListener( this ); RWT.getSessionStore().addSessionStoreListener( this ); } ////////////////// // IBrowserHistory public void createEntry( final String id, final String text ) { if( null == id ) { SWT.error( SWT.ERROR_NULL_ARGUMENT ); } if( id.length() == 0 ) { SWT.error( SWT.ERROR_INVALID_ARGUMENT ); } String quotedId = "\"" + EncodingUtil.escapeDoubleQuoted( id ) + "\""; String quotedText = text; if( quotedText != null ) { quotedText = "\"" + EncodingUtil.escapeDoubleQuoted( text ) + "\""; } String[] args = new String[]{ quotedId, quotedText }; JSExecutor.executeJS( MessageFormat.format( ADD_TO_HISTORY, args ) ); } public void addBrowserHistoryListener( final BrowserHistoryListener listener ) { if( null == listener ) { SWT.error( SWT.ERROR_NULL_ARGUMENT ); } BrowserHistoryEvent.addListener( this, listener ); } public void removeBrowserHistoryListener( final BrowserHistoryListener lsnr ) { if( null == lsnr ) { SWT.error( SWT.ERROR_NULL_ARGUMENT ); } BrowserHistoryEvent.removeListener( this, lsnr ); } //////////////// // PhaseListener public void afterPhase( final PhaseEvent event ) { } public void beforePhase( final PhaseEvent event ) { if( display == RWTLifeCycle.getSessionDisplay() ) { HttpServletRequest request = ContextProvider.getRequest(); String isEvent = request.getParameter( EVENT_HISTORY_NAVIGATED ); if( Boolean.valueOf( isEvent ).booleanValue() ) { String entryId = request.getParameter( EVENT_HISTORY_NAVIGATED_ENTRY_ID ); Event evt = new BrowserHistoryEvent( this, entryId ); evt.processEvent(); } } } public PhaseId getPhaseId() { return PhaseId.PROCESS_ACTION; } //////////// // Adaptable public Object getAdapter( final Class adapter ) { Object result; if( adapter == IEventAdapter.class ) { if( eventAdapter == null ) { eventAdapter = new EventAdapter(); } result = eventAdapter; } else { result = AdapterManagerImpl.getInstance().getAdapter( this, adapter ); } return result; } /////////////////////// // SessionStoreListener public void beforeDestroy( final SessionStoreEvent event ) { LifeCycleFactory.getLifeCycle().removePhaseListener( this ); } }