package org.lobobrowser.html.renderer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import org.lobobrowser.html.BrowserFrame;
import org.lobobrowser.html.domimpl.ModelNode;
import org.lobobrowser.html.style.HtmlInsets;
import org.lobobrowser.html.style.HtmlValues;
import org.lobobrowser.html.style.RenderState;
import org.w3c.dom.html.HTMLElement;
class BrowserFrameUIControl implements UIControl {
private final Component component;
private final HTMLElement element;
private final BrowserFrame browserFrame;
private RUIControl ruiControl;
public BrowserFrameUIControl(final HTMLElement element, final BrowserFrame browserFrame) {
this.component = browserFrame.getComponent();
this.browserFrame = browserFrame;
this.element = element;
}
public Color getBackgroundColor() {
return this.component.getBackground();
}
public Component getComponent() {
return this.component;
}
private int availWidth;
private int availHeight;
public void reset(final int availWidth, final int availHeight) {
this.availWidth = availWidth;
this.availHeight = availHeight;
final RUIControl ruiControl = this.ruiControl;
if (ruiControl != null) {
final ModelNode node = ruiControl.getModelNode();
final HTMLElement element = (HTMLElement) node;
final RenderState renderState = node.getRenderState();
HtmlInsets insets = null;
String marginwidth = element.getAttribute("marginwidth");
String marginheight = element.getAttribute("marginheight");
if ((marginwidth != null) && (marginwidth.length() != 0)) {
insets = new HtmlInsets();
marginwidth = marginwidth.trim();
if (marginwidth.endsWith("%")) {
int value;
try {
value = Integer.parseInt(marginwidth.substring(0, marginwidth.length() - 1));
} catch (final NumberFormatException nfe) {
value = 0;
}
insets.left = value;
insets.right = value;
insets.leftType = HtmlInsets.TYPE_PERCENT;
insets.rightType = HtmlInsets.TYPE_PERCENT;
} else {
int value;
try {
value = Integer.parseInt(marginwidth);
} catch (final NumberFormatException nfe) {
value = 0;
}
insets.left = value;
insets.right = value;
insets.leftType = HtmlInsets.TYPE_PIXELS;
insets.rightType = HtmlInsets.TYPE_PIXELS;
}
}
if ((marginheight != null) && (marginheight.length() != 0)) {
if (insets == null) {
insets = new HtmlInsets();
}
marginheight = marginheight.trim();
if (marginheight.endsWith("%")) {
int value;
try {
value = Integer.parseInt(marginheight.substring(0, marginheight.length() - 1));
} catch (final NumberFormatException nfe) {
value = 0;
}
insets.top = value;
insets.bottom = value;
insets.topType = HtmlInsets.TYPE_PERCENT;
insets.bottomType = HtmlInsets.TYPE_PERCENT;
} else {
int value;
try {
value = Integer.parseInt(marginheight);
} catch (final NumberFormatException nfe) {
value = 0;
}
insets.top = value;
insets.bottom = value;
insets.topType = HtmlInsets.TYPE_PIXELS;
insets.bottomType = HtmlInsets.TYPE_PIXELS;
}
}
final Insets awtMarginInsets = insets == null ? null : insets.getSimpleAWTInsets(availWidth, availHeight);
final int overflowX = renderState.getOverflowX();
final int overflowY = renderState.getOverflowY();
if (awtMarginInsets != null) {
this.browserFrame.setDefaultMarginInsets(awtMarginInsets);
}
if (overflowX != RenderState.OVERFLOW_NONE) {
this.browserFrame.setDefaultOverflowX(overflowX);
}
if (overflowY != RenderState.OVERFLOW_NONE) {
this.browserFrame.setDefaultOverflowY(overflowY);
}
}
}
public Dimension getPreferredSize() {
final int width = HtmlValues.getOldSyntaxPixelSize(element.getAttribute("width"), this.availWidth, 100);
final int height = HtmlValues.getOldSyntaxPixelSize(element.getAttribute("height"), this.availHeight, 100);
return new Dimension(width, height);
}
public void invalidate() {
this.component.invalidate();
}
public void paint(final Graphics g) {
// We actually have to paint it.
this.component.paint(g);
}
public boolean paintSelection(final Graphics g, final boolean inSelection, final RenderableSpot startPoint, final RenderableSpot endPoint) {
// Selection does not cross in here?
return false;
}
public void setBounds(final int x, final int y, final int width, final int height) {
this.component.setBounds(x, y, width, height);
}
public void setRUIControl(final RUIControl ruicontrol) {
this.ruiControl = ruicontrol;
}
}