// 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()</code> 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()</code> 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);
    }
  }
}
