| /* |
| * 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); |
| } |
| } |