blob: 2435e902e5c52e4df1d08bfc8c700657e50f8554 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.uiDesigner.compiler;
import com.intellij.uiDesigner.core.Spacer;
import com.intellij.uiDesigner.lw.LwComponent;
import com.intellij.uiDesigner.lw.LwContainer;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.GeneratorAdapter;
import org.jetbrains.org.objectweb.asm.commons.Method;
import javax.swing.*;
import java.awt.*;
/**
* @author yole
*/
public class GridBagLayoutCodeGenerator extends LayoutCodeGenerator {
private static final Type ourGridBagLayoutType = Type.getType(GridBagLayout.class);
private static final Type ourGridBagConstraintsType = Type.getType(GridBagConstraints.class);
private static final Method ourDefaultConstructor = Method.getMethod("void <init> ()");
private static final Type myPanelType = Type.getType(JPanel.class);
public String mapComponentClass(final String componentClassName) {
if (componentClassName.equals(Spacer.class.getName())) {
return JPanel.class.getName();
}
return super.mapComponentClass(componentClassName);
}
public void generateContainerLayout(final LwContainer lwContainer, final GeneratorAdapter generator, final int componentLocal) {
generator.loadLocal(componentLocal);
generator.newInstance(ourGridBagLayoutType);
generator.dup();
generator.invokeConstructor(ourGridBagLayoutType, ourDefaultConstructor);
generator.invokeVirtual(ourContainerType, ourSetLayoutMethod);
}
private void generateFillerPanel(final GeneratorAdapter generator, final int parentLocal, final GridBagConverter.Result result) {
int panelLocal = generator.newLocal(myPanelType);
generator.newInstance(myPanelType);
generator.dup();
generator.invokeConstructor(myPanelType, ourDefaultConstructor);
generator.storeLocal(panelLocal);
generateConversionResult(generator, result, panelLocal, parentLocal);
}
public void generateComponentLayout(final LwComponent component,
final GeneratorAdapter generator,
final int componentLocal,
final int parentLocal) {
GridBagConstraints gbc;
if (component.getCustomLayoutConstraints() instanceof GridBagConstraints) {
gbc = (GridBagConstraints) component.getCustomLayoutConstraints();
}
else {
gbc = new GridBagConstraints();
}
GridBagConverter.constraintsToGridBag(component.getConstraints(), gbc);
generateGridBagConstraints(generator, gbc, componentLocal, parentLocal);
}
private static void generateConversionResult(final GeneratorAdapter generator, final GridBagConverter.Result result,
final int componentLocal, final int parentLocal) {
checkSetSize(generator, componentLocal, "setMinimumSize", result.minimumSize);
checkSetSize(generator, componentLocal, "setPreferredSize", result.preferredSize);
checkSetSize(generator, componentLocal, "setMaximumSize", result.maximumSize);
generateGridBagConstraints(generator, result.constraints, componentLocal, parentLocal);
}
private static void generateGridBagConstraints(final GeneratorAdapter generator, GridBagConstraints constraints, final int componentLocal,
final int parentLocal) {
int gbcLocal = generator.newLocal(ourGridBagConstraintsType);
generator.newInstance(ourGridBagConstraintsType);
generator.dup();
generator.invokeConstructor(ourGridBagConstraintsType, ourDefaultConstructor);
generator.storeLocal(gbcLocal);
GridBagConstraints defaults = new GridBagConstraints();
if (defaults.gridx != constraints.gridx) {
setIntField(generator, gbcLocal, "gridx", constraints.gridx);
}
if (defaults.gridy != constraints.gridy) {
setIntField(generator, gbcLocal, "gridy", constraints.gridy);
}
if (defaults.gridwidth != constraints.gridwidth) {
setIntField(generator, gbcLocal, "gridwidth", constraints.gridwidth);
}
if (defaults.gridheight != constraints.gridheight) {
setIntField(generator, gbcLocal, "gridheight", constraints.gridheight);
}
if (defaults.weightx != constraints.weightx) {
setDoubleField(generator, gbcLocal, "weightx", constraints.weightx);
}
if (defaults.weighty != constraints.weighty) {
setDoubleField(generator, gbcLocal, "weighty", constraints.weighty);
}
if (defaults.anchor != constraints.anchor) {
setIntField(generator, gbcLocal, "anchor", constraints.anchor);
}
if (defaults.fill != constraints.fill) {
setIntField(generator, gbcLocal, "fill", constraints.fill);
}
if (defaults.ipadx != constraints.ipadx) {
setIntField(generator, gbcLocal, "ipadx", constraints.ipadx);
}
if (defaults.ipady != constraints.ipady) {
setIntField(generator, gbcLocal, "ipady", constraints.ipady);
}
if (!defaults.insets.equals(constraints.insets)) {
generator.loadLocal(gbcLocal);
AsmCodeGenerator.pushPropValue(generator, Insets.class.getName(), constraints.insets);
generator.putField(ourGridBagConstraintsType, "insets", Type.getType(Insets.class));
}
generator.loadLocal(parentLocal);
generator.loadLocal(componentLocal);
generator.loadLocal(gbcLocal);
generator.invokeVirtual(ourContainerType, ourAddMethod);
}
private static void checkSetSize(final GeneratorAdapter generator, final int componentLocal, final String methodName, final Dimension dimension) {
if (dimension != null) {
generator.loadLocal(componentLocal);
AsmCodeGenerator.pushPropValue(generator, "java.awt.Dimension", dimension);
generator.invokeVirtual(Type.getType(Component.class),
new Method(methodName, Type.VOID_TYPE, new Type[] { Type.getType(Dimension.class) }));
}
}
private static void setIntField(final GeneratorAdapter generator, final int local, final String fieldName, final int value) {
generator.loadLocal(local);
generator.push(value);
generator.putField(ourGridBagConstraintsType, fieldName, Type.INT_TYPE);
}
private static void setDoubleField(final GeneratorAdapter generator, final int local, final String fieldName, final double value) {
generator.loadLocal(local);
generator.push(value);
generator.putField(ourGridBagConstraintsType, fieldName, Type.DOUBLE_TYPE);
}
}