// -*- mode: java; c-basic-offset: 2; -*-
// Copyright 2009-2011 Google, All Rights reserved
// Copyright 2011-2012 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 lizlooney@google.com (Liz Looney)
*/
abstract class MockWrapper extends MockVisibleComponent {
private final SimplePanel wrapper;
private 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 final 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];
}
}