/******************************************************************************* * Copyright (c) 2002, 2009 Innoopract Informationssysteme GmbH. * 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: * Innoopract Informationssysteme GmbH - initial API and implementation * EclipseSource - ongoing development ******************************************************************************/ package org.eclipse.rwt.internal.lifecycle; import org.eclipse.rwt.lifecycle.*; import org.eclipse.swt.internal.widgets.*; import org.eclipse.swt.internal.widgets.WidgetTreeVisitor.AllWidgetTreeVisitor; import org.eclipse.swt.widgets.*; public final class PreserveWidgetsPhaseListener implements PhaseListener { private static final long serialVersionUID = 1L; public void beforePhase( final PhaseEvent event ) { } public void afterPhase( final PhaseEvent event ) { if( PhaseId.READ_DATA.equals( event.getPhaseId() ) ) { Display display = RWTLifeCycle.getSessionDisplay(); if( display != null ) { preserve( display ); } } else if( PhaseId.RENDER.equals( event.getPhaseId() ) ) { Display display = RWTLifeCycle.getSessionDisplay(); if( display != null ) { clearPreserved( display ); } } } public PhaseId getPhaseId() { return PhaseId.ANY; } ///////////////////////////////////////////////////// // Helping methods to preserve widget property values private static void preserve( final Display display ) { IDisplayLifeCycleAdapter displayLCA = DisplayUtil.getLCA( display ); IWidgetAdapter adapter = DisplayUtil.getAdapter( display ); if( adapter.isInitialized() ) { displayLCA.preserveValues( display ); IDisplayAdapter displayAdapter = ( IDisplayAdapter )display.getAdapter( IDisplayAdapter.class ); Composite[] shells = displayAdapter.getShells(); for( int i = 0; i < shells.length; i++ ) { WidgetTreeVisitor.accept( shells[ i ], new AllWidgetTreeVisitor() { public boolean doVisit( final Widget widget ) { AbstractWidgetLCA widgetLCA = WidgetUtil.getLCA( widget ); widgetLCA.preserveValues( widget ); return true; } } ); } } } static void clearPreserved( final Display display ) { WidgetAdapter widgetAdapter = ( WidgetAdapter )DisplayUtil.getAdapter( display ); widgetAdapter.clearPreserved(); IDisplayAdapter displayAdapter = ( IDisplayAdapter )display.getAdapter( IDisplayAdapter.class ); Composite[] shells = displayAdapter.getShells(); for( int i = 0; i < shells.length; i++ ) { WidgetTreeVisitor.accept( shells[ i ], new AllWidgetTreeVisitor() { public boolean doVisit( final Widget widget ) { WidgetAdapter widgetAdapter = ( WidgetAdapter )WidgetUtil.getAdapter( widget ); widgetAdapter.clearPreserved(); return true; } } ); } } }