/* GNU LESSER GENERAL PUBLIC LICENSE Copyright (C) 2006 The XAMJ Project This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Contact info: lobochief@users.sourceforge.net */ package org.lobobrowser.html.renderer; import java.awt.Dimension; import java.awt.Insets; import org.eclipse.jdt.annotation.NonNull; import org.lobobrowser.html.domimpl.ModelNode; import org.lobobrowser.ua.UserAgentContext; public class RImgControl extends RUIControl { public RImgControl(final ModelNode me, final ImgControl widget, final RenderableContainer container, final FrameContext frameContext, final UserAgentContext ucontext) { super(me, widget, container, frameContext, ucontext); } // TODO: This is a hack. RUIControl excludes border insets from the UI control. Images need to exclude padding as well. // Hence, we are returning getInsets() from getBorderInsets(). // A better way would be to create two methods: one for excluded space and one for included space and implement as per convenience. // Yet another idea: check if RImgControl really needs to sub-class RUIControl or it can directly sub-class BaseElementRenderable. @Override public @NonNull Insets getBorderInsets() { return getInsets(false, false); } @Override public void doLayout(int availWidth, int availHeight, boolean sizeOnly) { super.doLayout(availWidth, availHeight, sizeOnly); updateWidthHeight(); } private void updateWidthHeight() { final boolean widthConstrained = isWidthConstrained(); final boolean heightConstrained = isHeightConstrained(); if (!widthConstrained && heightConstrained) { final Dimension prefSize = widget.getPreferredSize(); if (prefSize.height != 0) { this.width = (prefSize.width * getInnerMostHeight()) / prefSize.height; } } else if (!heightConstrained && widthConstrained) { final Dimension prefSize = widget.getPreferredSize(); if (prefSize.width != 0) { this.height = (prefSize.height * getInnerMostWidth()) / prefSize.width; } } } @Override public void setInnerWidth(final Integer newWidth) { super.setInnerWidth(newWidth); updateWidthHeight(); } @Override public void setInnerHeight(final Integer newHeight) { super.setInnerHeight(newHeight); updateWidthHeight(); } @Override public boolean isReadyToPaint() { return super.isReadyToPaint() && widget.isReadyToPaint(); } @Override public String toString() { return "RImgControl : " + modelNode; } }