// -*- mode: java; c-basic-offset: 2; -*-
// Copyright 2009-2011 Google, All Rights reserved
// Copyright 2011-2020 MIT, All rights reserved
// Released under the Apache License, Version 2.0
// http://www.apache.org/licenses/LICENSE-2.0

package com.google.appinventor.client.editor.simple.components;

import com.google.appinventor.client.editor.simple.SimpleEditor;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;

/**
 * Base class for mock components that need a wrapper around them so that the
 * real component's border is not overridden by our CSS border (see
 * ode-SimpleMockComponent in Ya.css)
 *
 * <p/>For example, this class is extended by MockButtonBase, MockTextBoxBase,
 * and MockPasswordTextBoxBase, so that the 3D border of those components is not
 * replaced by the border specified in the CSS style ode-SimpleMockComponent.
 * We need both the component's 3D border as well as the 2 pixel outline border
 * (red when selected) that comes from the ode-SimpleMockComponent style.
 *
 * @author [email protected] (Liz Looney)
 */
abstract class MockWrapper extends MockVisibleComponent {
  private final SimplePanel wrapper;
  protected int[] preferredSize;

  MockWrapper(SimpleEditor editor, String type, ImageResource icon) {
    super(editor, type, icon);

    // Initialize wrapper UI
    wrapper = new SimplePanel();
    wrapper.setStylePrimaryName("ode-SimpleMockComponent");
  }

  /**
   * Sets the widget that is wrapped by the wrapper.
   */
  protected final void initWrapper(Widget wrappedWidget) {
    // The wrapped widget should always fill up the wrapper.
    wrappedWidget.setSize("100%", "100%");
    wrapper.setWidget(wrappedWidget);
    initComponent(wrapper);
  }

  /**
   * Subclasses must implement createClonedWidget.
   *
   * <p/>It should return a clone of the widget being wrapped that will be used
   * to determine the preferred size, without having the size constrained by
   * its parent, since the cloned widget won't have a parent.
   */
  protected abstract Widget createClonedWidget();

  protected void updatePreferredSize() {
    preferredSize = MockComponentsUtil.getPreferredSizeOfDetachedWidget(createClonedWidget());
  }

  @Override
  public int getPreferredWidth() {
    // The superclass uses getOffsetWidth, which won't work for us.
    if (preferredSize == null) {
      updatePreferredSize();
    }
    return preferredSize[0];
  }

  @Override
  public int getPreferredHeight() {
    // The superclass uses getOffsetHeight, which won't work for us.
    if (preferredSize == null) {
      updatePreferredSize();
    }
    return preferredSize[1];
  }
}