/******************************************************************************* * Copyright (c) 2011 Frank Appel 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: * Frank Appel - initial API and implementation ******************************************************************************/ package com.codeaffine.example.rwt.osgi.ui.platform.internal; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import com.codeaffine.example.rwt.osgi.ui.platform.LayoutProvider; import com.codeaffine.example.rwt.osgi.ui.platform.PageService; import com.codeaffine.example.rwt.osgi.ui.platform.PageTracker; import com.codeaffine.example.rwt.osgi.ui.platform.UIContributor; public class PageServiceImpl implements PageService { private final LayoutProvider layoutProvider; private final LayoutContextImpl layoutContext; private final Map<String, UIContributor> pageContributors; private final Set<PageTracker> pageTrackers; private final Object lock; private Composite contentParent; private String pageId; private UIContributor homePageContributor; public PageServiceImpl( LayoutProvider layoutProvider, LayoutContextImpl layoutContext ) { this.layoutProvider = layoutProvider; this.layoutContext = layoutContext; this.pageContributors = new HashMap<String,UIContributor>(); this.pageTrackers = new HashSet<PageTracker>(); this.lock = new Object(); } @Override public void registerContentParent( Composite contentParent ) { this.contentParent = contentParent; } public void addPageContributor( UIContributor pageContributor ) { Object[] trackers; synchronized( lock ) { pageContributors.put( pageContributor.getId(), pageContributor ); trackers = pageTrackers.toArray(); } for( int i = 0; i < trackers.length; i++ ) { ( ( PageTracker )trackers[ i ] ).pageAdded( pageContributor ); } } public void removePageContibutor( UIContributor pageContributor ) { Object[] trackers; synchronized( lock ) { pageContributors.remove( pageContributor.getId() ); trackers = pageTrackers.toArray(); } for( int i = 0; i < trackers.length; i++ ) { ( ( PageTracker )trackers[ i ] ).pageRemoved( pageContributor ); } } void setHomePageContributor( UIContributor homePageContributor ) { addPageContributor( homePageContributor ); this.homePageContributor = homePageContributor; } @Override public void selectPage( String pageId ) { if( !pageId.equals( this.pageId ) ) { disposeOfCurrentPageContent(); createNewContent( pageId ); layoutShell(); this.pageId = pageId; } } @Override public void selectHomePage() { if( homePageContributor != null ) { selectPage( homePageContributor.getId() ); } else { synchronized( lock ) { if( !pageContributors.isEmpty() ) { selectPage( ( String )pageContributors.keySet().toArray()[ 0 ] ); } } } } @Override public String[] getPageIds() { synchronized( lock ) { String[] result = new String[ pageContributors.size() ]; pageContributors.keySet().toArray( result ); return result; } } private void layoutShell() { layoutProvider.layout( layoutContext ); layoutContext.layoutShell(); } private void createNewContent( String pageId ) { UIContributor uiProvider; synchronized( lock ) { uiProvider = pageContributors.get( pageId ); } uiProvider.contribute( contentParent ); } private void disposeOfCurrentPageContent() { Control[] children = contentParent.getChildren(); for( Control control : children ) { control.dispose(); } } @Override public void addPageTracker( PageTracker pageTracker ) { Object[] contributors; synchronized( lock ) { pageTrackers.add( pageTracker ); contributors = pageContributors.values().toArray(); } for( int i = 0; i < contributors.length; i++ ) { pageTracker.pageAdded( ( UIContributor )contributors[ i ] ); } } @Override public void removePageTracker( PageTracker pageTracker ) { Object[] contributors; synchronized( lock ) { pageTrackers.remove( pageTracker ); contributors = pageContributors.values().toArray(); } for( int i = 0; i < contributors.length; i++ ) { pageTracker.pageRemoved( ( UIContributor )contributors[ i ] ); } } }