// 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(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(V view) {}

  @SuppressWarnings("unchecked")
  final void swap(View v) {
    if (next != null && next.getWidget() == v) {
      if (current != null) {
        main.remove(current);
      }
      current = next;
      next = null;
      current.setVisible(true);
      onShowView((V) v);
    }
  }
}
