| /* |
| * 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.core; |
| |
| import java.awt.*; |
| |
| /** |
| * @author Anton Katilin |
| * @author Vladimir Kondratyev |
| */ |
| public abstract class AbstractLayout implements LayoutManager2 { |
| /** |
| * Default value of HGAP property |
| */ |
| public static final int DEFAULT_HGAP = 10; |
| /** |
| * Default value of VGAP property |
| */ |
| public static final int DEFAULT_VGAP = 5; |
| |
| protected Component[] myComponents; |
| protected GridConstraints[] myConstraints; |
| /** |
| * This is margin between container bounds and bounds of the |
| * area where child components are laid out. |
| */ |
| protected Insets myMargin; |
| /** |
| * Horizontal gap between columns. This parameter is used only by GridLayoutManager. |
| */ |
| private int myHGap; |
| /** |
| * Vertical gap between rows. This parameter is used only by GridLayoutManager. |
| */ |
| private int myVGap; |
| private static final Component[] COMPONENT_EMPTY_ARRAY = new Component[0]; |
| |
| public AbstractLayout(){ |
| myComponents = COMPONENT_EMPTY_ARRAY; |
| myConstraints = GridConstraints.EMPTY_ARRAY; |
| myMargin = new Insets(0,0,0,0); |
| myHGap = -1; |
| myVGap = -1; |
| } |
| |
| public final Insets getMargin(){ |
| return (Insets)myMargin.clone(); |
| } |
| |
| /** |
| * @return current own value of horizontal gap between columns. If horizontal |
| * gap isn't defined then the method returns <code>-1</code>. |
| */ |
| public final int getHGap(){ |
| return myHGap; |
| } |
| |
| /** |
| * @return horizontal gap (if it's defined in the layout) or traverses |
| * the container hierarchy to find "inherited" HGAP property. Note, that |
| * the method always return positive value. |
| */ |
| protected static int getHGapImpl(Container container){ |
| if(container==null){ |
| throw new IllegalArgumentException("container cannot be null"); |
| } |
| while(container!=null){ |
| if(container.getLayout() instanceof AbstractLayout){ |
| final AbstractLayout layout=(AbstractLayout)container.getLayout(); |
| if(layout.getHGap()!=-1){ |
| return layout.getHGap(); |
| } |
| } |
| container = container.getParent(); |
| } |
| return DEFAULT_HGAP; |
| } |
| |
| /** |
| * @param hGap new horizontal gap. If <code>hGap</code> is <code>-1</code> |
| * then own gap is not defined and it should be inherited from parent container. |
| * |
| * @exception java.lang.IllegalArgumentException if <code>hGap</code> is less |
| * then <code>-1</code> |
| */ |
| public final void setHGap(final int hGap){ |
| if(hGap<-1){ |
| throw new IllegalArgumentException("wrong hGap: "+hGap); |
| } |
| myHGap=hGap; |
| } |
| |
| /** |
| * @return current own value of vertical gap between rows. If vertical |
| * gap isn't defined then the method returns <code>-1</code>. |
| */ |
| public final int getVGap(){ |
| return myVGap; |
| } |
| |
| /** |
| * @return horizontal gap (if it's defined in the layout) or traverses |
| * the container hierarchy to find "inherited" HGAP property. Note, that |
| * the method always return positive value. |
| */ |
| protected static int getVGapImpl(Container container){ |
| if(container==null){ |
| throw new IllegalArgumentException("container cannot be null"); |
| } |
| while(container!=null){ |
| if(container.getLayout() instanceof AbstractLayout){ |
| final AbstractLayout layout=(AbstractLayout)container.getLayout(); |
| if(layout.getVGap() !=-1){ |
| return layout.getVGap(); |
| } |
| } |
| container = container.getParent(); |
| } |
| return DEFAULT_VGAP; |
| } |
| |
| /** |
| * Sets new vertical gap between rows |
| * |
| * @param vGap new vertical gap. If <code>vGap</code> is <code>-1</code> |
| * then own gap is not defined and it should be inherited from parent container. |
| * |
| * @exception java.lang.IllegalArgumentException if <code>vGap</code> is less |
| * then <code>-1</code> |
| */ |
| public final void setVGap(final int vGap){ |
| if(vGap<-1){ |
| throw new IllegalArgumentException("wrong vGap: "+vGap); |
| } |
| myVGap=vGap; |
| } |
| |
| public final void setMargin(final Insets margin){ |
| if (margin == null) { |
| throw new IllegalArgumentException("margin cannot be null"); |
| } |
| myMargin = (Insets)margin.clone(); |
| } |
| |
| final int getComponentCount(){ |
| return myComponents.length; |
| } |
| |
| final Component getComponent(final int index){ |
| return myComponents[index]; |
| } |
| |
| final GridConstraints getConstraints(final int index){ |
| return myConstraints[index]; |
| } |
| |
| public void addLayoutComponent(final Component comp, final Object constraints){ |
| if (!(constraints instanceof GridConstraints)) { |
| throw new IllegalArgumentException("constraints: " + constraints); |
| } |
| |
| final Component[] newComponents = new Component[myComponents.length + 1]; |
| System.arraycopy(myComponents, 0, newComponents, 0, myComponents.length); |
| newComponents[myComponents.length] = comp; |
| myComponents = newComponents; |
| |
| final GridConstraints[] newConstraints = new GridConstraints[myConstraints.length + 1]; |
| System.arraycopy(myConstraints, 0, newConstraints, 0, myConstraints.length); |
| newConstraints[myConstraints.length] = (GridConstraints)((GridConstraints)constraints).clone(); |
| myConstraints = newConstraints; |
| } |
| |
| public final void addLayoutComponent(final String name, final Component comp){ |
| throw new UnsupportedOperationException(); |
| } |
| |
| public final void removeLayoutComponent(final Component comp){ |
| final int i = getComponentIndex(comp); |
| if (i == -1) { |
| throw new IllegalArgumentException("component was not added: " + comp); |
| } |
| |
| if (myComponents.length == 1) { |
| myComponents = COMPONENT_EMPTY_ARRAY; |
| } |
| else { |
| final Component[] newComponents = new Component[myComponents.length - 1]; |
| System.arraycopy(myComponents, 0, newComponents, 0, i); |
| System.arraycopy(myComponents, i + 1, newComponents, i, myComponents.length - i - 1); |
| myComponents = newComponents; |
| } |
| |
| if (myConstraints.length == 1) { |
| myConstraints = GridConstraints.EMPTY_ARRAY; |
| } |
| else { |
| final GridConstraints[] newConstraints = new GridConstraints[myConstraints.length - 1]; |
| System.arraycopy(myConstraints, 0, newConstraints, 0, i); |
| System.arraycopy(myConstraints, i + 1, newConstraints, i, myConstraints.length - i - 1); |
| myConstraints = newConstraints; |
| } |
| } |
| |
| public GridConstraints getConstraintsForComponent(Component comp) { |
| final int i = getComponentIndex(comp); |
| if (i == -1) { |
| throw new IllegalArgumentException("component was not added: " + comp); |
| } |
| |
| return myConstraints[i]; |
| } |
| |
| private int getComponentIndex(final Component comp){ |
| for (int i = 0; i < myComponents.length; i++) { |
| final Component component = myComponents[i]; |
| if (component == comp) { |
| return i; |
| } |
| } |
| return -1; |
| } |
| |
| public final float getLayoutAlignmentX(final Container container){ |
| return 0.5f; |
| } |
| |
| public final float getLayoutAlignmentY(final Container container){ |
| return 0.5f; |
| } |
| |
| public abstract Dimension maximumLayoutSize(Container target); |
| public abstract void invalidateLayout(Container target); |
| public abstract Dimension preferredLayoutSize(Container parent); |
| public abstract Dimension minimumLayoutSize(Container parent); |
| public abstract void layoutContainer(Container parent); |
| } |