|  | // Copyright (C) 2009 The Android Open Source Project | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | // http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | package com.google.gwtexpui.user.client; | 
|  |  | 
|  | import com.google.gwt.user.client.ui.Composite; | 
|  | import com.google.gwt.user.client.ui.FlowPanel; | 
|  | import com.google.gwt.user.client.ui.SimplePanel; | 
|  |  | 
|  | /** | 
|  | * Hosts a single {@link View}. | 
|  | * | 
|  | * <p>View instances are attached inside of an invisible DOM node, permitting their {@code onLoad()} | 
|  | * method to be invoked and to update the DOM prior to the elements being made visible in the UI. | 
|  | * | 
|  | * <p>Complaint View instances must invoke {@link View#display()} once the DOM is ready for | 
|  | * presentation. | 
|  | */ | 
|  | public class ViewSite<V extends View> extends Composite { | 
|  | private final FlowPanel main; | 
|  | private SimplePanel current; | 
|  | private SimplePanel next; | 
|  |  | 
|  | public ViewSite() { | 
|  | main = new FlowPanel(); | 
|  | initWidget(main); | 
|  | } | 
|  |  | 
|  | /** Get the current view; null if there is no view being displayed. */ | 
|  | @SuppressWarnings("unchecked") | 
|  | public V getView() { | 
|  | return current != null ? (V) current.getWidget() : null; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Set the next view to display. | 
|  | * | 
|  | * <p>The view will be attached to the DOM tree within a hidden container, permitting its {@code | 
|  | * onLoad()} method to execute and update the DOM without the user seeing the result. | 
|  | * | 
|  | * @param view the next view to display. | 
|  | */ | 
|  | public void setView(final V view) { | 
|  | if (next != null) { | 
|  | main.remove(next); | 
|  | } | 
|  | view.site = this; | 
|  | next = new SimplePanel(); | 
|  | next.setVisible(false); | 
|  | main.add(next); | 
|  | next.add(view); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Invoked after the view becomes the current view and has been made visible. | 
|  | * | 
|  | * @param view the view being displayed. | 
|  | */ | 
|  | protected void onShowView(final V view) {} | 
|  |  | 
|  | @SuppressWarnings("unchecked") | 
|  | final void swap(final View v) { | 
|  | if (next != null && next.getWidget() == v) { | 
|  | if (current != null) { | 
|  | main.remove(current); | 
|  | } | 
|  | current = next; | 
|  | next = null; | 
|  | current.setVisible(true); | 
|  | onShowView((V) v); | 
|  | } | 
|  | } | 
|  | } |