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