blob: e5c18a30e558cb620ac153d4c814d21b56963bc7 [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.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);
}