com.codename1.ui.layouts.mig.CodenameOneMiGComponentWrapper Maven / Gradle / Ivy
package com.codename1.ui.layouts.mig;
/*
* License (BSD):
* ==============
*
* Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
* Neither the name of the MiG InfoCom AB nor the names of its contributors may be
* used to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* @version 1.0
* @author Mikael Grev, MiG InfoCom AB
* Date: 2006-sep-08
*/
import com.codename1.components.InfiniteProgress;
import com.codename1.ui.Button;
import com.codename1.ui.CheckBox;
import com.codename1.ui.ComboBox;
import com.codename1.ui.Component;
import com.codename1.ui.Container;
import com.codename1.ui.Display;
import com.codename1.ui.Font;
import com.codename1.ui.Label;
import com.codename1.ui.List;
import com.codename1.ui.RadioButton;
import com.codename1.ui.Slider;
import com.codename1.ui.Tabs;
import com.codename1.ui.TextArea;
import com.codename1.ui.TextField;
import com.codename1.ui.geom.Dimension;
import com.codename1.ui.layouts.mig.ComponentWrapper;
import com.codename1.ui.layouts.mig.ContainerWrapper;
import com.codename1.ui.layouts.mig.LayoutUtil;
import com.codename1.ui.layouts.mig.PlatformDefaults;
import com.codename1.ui.spinner.BaseSpinner;
import com.codename1.ui.table.Table;
import java.util.IdentityHashMap;
/**
*/
class CodenameOneMiGComponentWrapper implements ComponentWrapper
{
private static boolean maxSet = false;
private static boolean vp = true;
/** Debug color for component bounds outline.
*/
//private static final Color DB_COMP_OUTLINE = new Color(0, 0, 200);
/** Property to use in LAF settings and as JComponent client property
* to specify the visual padding.
*
*/
private static final String VISUAL_PADDING_PROPERTY = com.codename1.ui.layouts.mig.PlatformDefaults.VISUAL_PADDING_PROPERTY;
private final Component c;
private int compType = TYPE_UNSET;
private Boolean bl = null;
private boolean prefCalled = false;
public CodenameOneMiGComponentWrapper(Component c)
{
this.c = c;
}
public final int getBaseline(int width, int height)
{
int baseLine = c.getBaseline(width < 0 ? c.getWidth() : width, height < 0 ? c.getHeight() : height);
if (baseLine != -1) {
int[] visPad = getVisualPadding();
if (visPad != null)
baseLine += (visPad[2] - visPad[0] + 1) / 2;
}
return baseLine;
}
public final Object getComponent()
{
return c;
}
/** Cache.
*/
//private final static IdentityHashMap FM_MAP = new IdentityHashMap(4);
private final static Font SUBST_FONT = Font.getDefaultFont();
public final float getPixelUnitFactor(boolean isHor)
{
switch (PlatformDefaults.getLogicalPixelBase()) {
case PlatformDefaults.BASE_FONT_SIZE:
/*Font font = c.getFont();
FontMetrics fm = c.getFontMetrics(font != null ? font : SUBST_FONT);
Point.Float p = FM_MAP.get(fm);
if (p == null) {
Rectangle2D r = fm.getStringBounds("X", c.getGraphics());
p = new Point.Float(((float) r.getWidth()) / 6f, ((float) r.getHeight()) / 13.27734375f);
FM_MAP.put(fm, p);
}
return isHor ? p.x : p.y;*/
return isHor ? ((float)SUBST_FONT.charWidth('X')) /6f : ((float)SUBST_FONT.getHeight() / 13.27734375f);
case PlatformDefaults.BASE_SCALE_FACTOR:
Float s = isHor ? PlatformDefaults.getHorizontalScaleFactor() : PlatformDefaults.getVerticalScaleFactor();
if (s == null)
s = new Float(1.0f);
return s * (isHor ? getHorizontalScreenDPI() : getVerticalScreenDPI()) / (float) PlatformDefaults.getDefaultDPI();
default:
return 1f;
}
}
public final int getX()
{
return c.getX();
}
public final int getY()
{
return c.getY();
}
public final int getHeight()
{
return c.getHeight();
}
public final int getWidth()
{
return c.getWidth();
}
public final int getScreenLocationX()
{
return 0;
}
public final int getScreenLocationY()
{
return 0;
}
public final int getMinimumHeight(int sz)
{
return c.getPreferredH();
}
public final int getMinimumWidth(int sz)
{
return c.getPreferredW();
}
public final int getPreferredHeight(int sz)
{
return c.getPreferredH();
}
public final int getPreferredWidth(int sz)
{
return c.getPreferredW();
}
public final int getMaximumHeight(int sz)
{
Container p = c.getParent();
if(p != null) {
int w = p.getHeight();
if(w > 10) {
return w;
}
}
return Display.getInstance().getDisplayHeight();
}
public final int getMaximumWidth(int sz)
{
Container p = c.getParent();
if(p != null) {
int w = p.getWidth();
if(w > 10) {
return w;
}
}
return Display.getInstance().getDisplayWidth();
}
private boolean isMaxSet(Component c)
{
return false;
}
public final ContainerWrapper getParent()
{
Container p = c.getParent();
return p != null ? new CodenameOneMiGContainerWrapper(p) : null;
}
public final int getHorizontalScreenDPI() {
return PlatformDefaults.getDefaultDPI();
}
public final int getVerticalScreenDPI()
{
return PlatformDefaults.getDefaultDPI();
}
public final int getScreenWidth()
{
return Display.getInstance().getDisplayWidth();
}
public final int getScreenHeight()
{
return Display.getInstance().getDisplayHeight();
}
public final boolean hasBaseline()
{
return true;
}
public final String getLinkId()
{
return c.getName();
}
public final void setBounds(int x, int y, int width, int height)
{
c.setX(x);
c.setY(y);
c.setWidth(width);
c.setHeight(height);
}
public boolean isVisible()
{
return c.isVisible();
}
public final int[] getVisualPadding()
{
// TOOD, optimize this
int[] padding = new int[] {c.getStyle().getMarginTop(), c.getStyle().getMarginLeftNoRTL(),
c.getStyle().getMarginBottom(), c.getStyle().getMarginRightNoRTL()};
return padding;
}
/**
* @deprecated Java 1.4 is not supported anymore
*/
public static boolean isMaxSizeSetOn1_4()
{
return maxSet;
}
/**
* @deprecated Java 1.4 is not supported anymore
*/
public static void setMaxSizeSetOn1_4(boolean b)
{
maxSet = b;
}
public static boolean isVisualPaddingEnabled()
{
return vp;
}
public static void setVisualPaddingEnabled(boolean b)
{
vp = b;
}
public final void paintDebugOutline(boolean showVisualPadding)
{
/*if (c.isShowing() == false)
return;
Graphics2D g = (Graphics2D) c.getGraphics();
if (g == null)
return;
g.setPaint(DB_COMP_OUTLINE);
g.setStroke(new BasicStroke(1f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10f, new float[] {2f, 4f}, 0));
g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
if (showVisualPadding && isVisualPaddingEnabled()) {
int[] padding = getVisualPadding();
if (padding != null) {
g.setColor(Color.GREEN);
g.drawRect(padding[1], padding[0], (getWidth() - 1) - (padding[1] + padding[3]), (getHeight() - 1) - (padding[0] + padding[2]));
}
}*/
}
public int getComponentType(boolean disregardScrollPane)
{
if (compType == TYPE_UNSET)
compType = checkType(disregardScrollPane);
return compType;
}
public int getLayoutHashCode()
{
Dimension d = c.getPreferredSize();
int hash = (d.getWidth() << 10) + (d.getHeight() << 15);
if (c.isVisible())
hash += 1324511;
String id = getLinkId();
if (id != null)
hash += id.hashCode();
return hash;
}
private int checkType(boolean disregardScrollPane)
{
Component c = this.c;
if (c instanceof TextField) {
return TYPE_TEXT_FIELD;
} else if (c instanceof Label) {
return TYPE_LABEL;
} else if (c instanceof RadioButton || c instanceof CheckBox) {
return TYPE_CHECK_BOX;
} else if (c instanceof Button) {
return TYPE_BUTTON;
} else if (c instanceof ComboBox) {
return TYPE_COMBO_BOX;
} else if (c instanceof TextArea) {
return TYPE_TEXT_AREA;
} else if (c instanceof Container) {
return TYPE_PANEL;
} else if (c instanceof List) {
return TYPE_LIST;
} else if (c instanceof Table) {
return TYPE_TABLE;
} else if (c instanceof BaseSpinner) {
return TYPE_SPINNER;
} else if (c instanceof Tabs) {
return TYPE_TABBED_PANE;
} else if (c instanceof InfiniteProgress) {
return TYPE_PROGRESS_BAR;
} else if (c instanceof Slider) {
return TYPE_SLIDER;
}
return TYPE_UNKNOWN;
}
public final int hashCode()
{
return getComponent().hashCode();
}
public final boolean equals(Object o)
{
if (o instanceof ComponentWrapper == false)
return false;
return c.equals(((ComponentWrapper) o).getComponent());
}
public int getContentBias()
{
return c instanceof TextArea || (Boolean.TRUE.equals(((Component)c).getClientProperty("migLayout.dynamicAspectRatio"))) ? LayoutUtil.HORIZONTAL : -1;
}
}