blob: 9d4b538edbb62eeef730a63ab28ed0ac1b31f8c8 [file] [log] [blame]
/*
* Copyright 2000-2011 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.util.ui;
import gnu.trove.TIntDoubleHashMap;
import gnu.trove.TIntIntHashMap;
import gnu.trove.TIntObjectHashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
/**
* Usage:
* <pre>
* {@code
*
* // First, configure default for every or a specific column:
* GridBag bag = new GridBag()
* .setDefaultAnchor(0, GridBagConstraints.EAST)
* .setDefaultAnchor(1, GridBagConstraints.WEST)
* .setDefaultWeightX(1, 1)
* .setDefaultFill(GridBagConstraints.HORIZONTAL);
*
* // Then, add components to a panel:
*
* // The following code adds a new line with 2 components with default settings:
* panel.add(c1, bag.nextLine().next())
* panel.add(c1, bag.next())
*
* // The following code adds a component on the next line that covers all remaining columns:
* panel.add(c1, bag.nextLine().coverLine())
*
* // The following code adds a component on the next line with overridden settings:
* panel.add(c1, bag.nextLine().next().insets(...).weightx(...))
*
* // You also can pre-configure the object and pass it as a constraint:
* bag.nextLine().next();
* panel.add(c1, bag)
* }
* </pre>
* Note that every call of {@link #nextLine()} or {@link #next()} resets settings to the defaults for the corresponding column.
*/
@SuppressWarnings({"JavaDoc"})
public class GridBag extends GridBagConstraints {
private int myDefaultAnchor = anchor;
@NotNull private final TIntIntHashMap myDefaultColumnAnchors = new TIntIntHashMap();
private int myDefaultFill = fill;
@NotNull private final TIntIntHashMap myDefaultColumnFills = new TIntIntHashMap();
private double myDefaultWeightX = weightx;
@NotNull private final TIntDoubleHashMap myDefaultColumnWeightsX = new TIntDoubleHashMap();
private double myDefaultWeightY = weighty;
@NotNull private final TIntDoubleHashMap myDefaultColumnWeightsY = new TIntDoubleHashMap();
private int myDefaultPaddingX = ipadx;
@NotNull private final TIntIntHashMap myDefaultColumnPaddingsX = new TIntIntHashMap();
private int myDefaultPaddingY = ipady;
@NotNull private final TIntIntHashMap myDefaultColumnPaddingsY = new TIntIntHashMap();
@Nullable private Insets myDefaultInsets = insets;
@NotNull private final TIntObjectHashMap<Insets> myDefaultColumnInsets = new TIntObjectHashMap<Insets>();
public GridBag() {
gridx = gridy = -1;
}
@NotNull
public GridBag nextLine() {
gridy++;
gridx = -1;
return reset();
}
@NotNull
public GridBag next() {
gridx++;
return reset();
}
public int getLine() {
return gridy;
}
@NotNull
public GridBag setLine(int line) {
gridy = line;
return this;
}
public int getColumn() {
return gridx;
}
@NotNull
public GridBag setColumn(int cell) {
gridx = cell;
return this;
}
@NotNull
public GridBag reset() {
gridwidth = gridheight = 1;
int column = gridx;
anchor(getDefaultAnchor(column));
fill = getDefaultFill(column);
weightx(getDefaultWeightX(column));
weighty(getDefaultWeightY(column));
padx(getDefaultPaddingX(column));
pady(getDefaultPaddingY(column));
insets(getDefaultInsets(column));
return this;
}
@NotNull
public GridBag anchor(int anchor) {
this.anchor = anchor;
return this;
}
@NotNull
public GridBag fillCell() {
fill = GridBagConstraints.BOTH;
return this;
}
@NotNull
public GridBag fillCellHorizontally() {
fill = GridBagConstraints.HORIZONTAL;
return this;
}
@NotNull
public GridBag fillCellVertically() {
fill = GridBagConstraints.VERTICAL;
return this;
}
public GridBag fillCellNone() {
fill = GridBagConstraints.NONE;
return this;
}
@NotNull
public GridBag weightx(double weight) {
weightx = weight;
return this;
}
@NotNull
public GridBag weighty(double weight) {
weighty = weight;
return this;
}
@NotNull
public GridBag coverLine() {
gridwidth = GridBagConstraints.REMAINDER;
return this;
}
@NotNull
public GridBag coverLine(int cells) {
gridwidth = cells;
return this;
}
@NotNull
public GridBag coverColumn() {
gridheight = GridBagConstraints.REMAINDER;
return this;
}
@NotNull
public GridBag coverColumn(int cells) {
gridheight = cells;
return this;
}
@NotNull
public GridBag padx(int padding) {
ipadx = padding;
return this;
}
@NotNull
public GridBag pady(int padding) {
ipady = padding;
return this;
}
/**
* @see #insets(java.awt.Insets)
*/
@NotNull
public GridBag insets(int top, int left, int bottom, int right) {
return insets(new Insets(top, left, bottom, right));
}
/**
* Pass -1 to use a default value for this column.
* E.g, Insets(10, -1, -1, -1) means that 'top' will be changed to 10 and other sides will be set to defaults for this column.
*/
@NotNull
public GridBag insets(@Nullable Insets insets) {
if (insets != null && (insets.top < 0 || insets.bottom < 0 || insets.left < 0 || insets.right < 0)) {
Insets def = getDefaultInsets(gridx);
insets = (Insets)insets.clone();
if (insets.top < 0) insets.top = def == null ? 0 : def.top;
if (insets.left < 0) insets.left = def == null ? 0 : def.left;
if (insets.bottom < 0) insets.bottom = def == null ? 0 : def.bottom;
if (insets.right < 0) insets.right = def == null ? 0 : def.right;
}
this.insets = insets;
return this;
}
public int getDefaultAnchor() {
return myDefaultAnchor;
}
@NotNull
public GridBag setDefaultAnchor(int anchor) {
myDefaultAnchor = anchor;
return this;
}
public int getDefaultAnchor(int column) {
return myDefaultColumnAnchors.containsKey(column) ? myDefaultColumnAnchors.get(column) : getDefaultAnchor();
}
@NotNull
public GridBag setDefaultAnchor(int column, int anchor) {
if (anchor == -1) {
myDefaultColumnAnchors.remove(column);
}
else {
myDefaultColumnAnchors.put(column, anchor);
}
return this;
}
public int getDefaultFill() {
return myDefaultFill;
}
@NotNull
public GridBag setDefaultFill(int fill) {
myDefaultFill = fill;
return this;
}
public int getDefaultFill(int column) {
return myDefaultColumnFills.containsKey(column) ? myDefaultColumnFills.get(column) : getDefaultFill();
}
@NotNull
public GridBag setDefaultFill(int column, int fill) {
if (fill == -1) {
myDefaultColumnFills.remove(column);
}
else {
myDefaultColumnFills.put(column, fill);
}
return this;
}
public double getDefaultWeightX() {
return myDefaultWeightX;
}
@NotNull
public GridBag setDefaultWeightX(double weight) {
myDefaultWeightX = weight;
return this;
}
public double getDefaultWeightX(int column) {
return myDefaultColumnWeightsX.containsKey(column) ? myDefaultColumnWeightsX.get(column) : getDefaultWeightX();
}
@NotNull
public GridBag setDefaultWeightX(int column, double weight) {
if (weight == -1) {
myDefaultColumnWeightsX.remove(column);
}
else {
myDefaultColumnWeightsX.put(column, weight);
}
return this;
}
public double getDefaultWeightY() {
return myDefaultWeightY;
}
@NotNull
public GridBag setDefaultWeightY(double weight) {
myDefaultWeightY = weight;
return this;
}
public double getDefaultWeightY(int column) {
return myDefaultColumnWeightsY.containsKey(column) ? myDefaultColumnWeightsY.get(column) : getDefaultWeightY();
}
@NotNull
public GridBag setDefaultWeightY(int column, double weight) {
if (weight == -1) {
myDefaultColumnWeightsY.remove(column);
}
else {
myDefaultColumnWeightsY.put(column, weight);
}
return this;
}
public int getDefaultPaddingX() {
return myDefaultPaddingX;
}
@NotNull
public GridBag setDefaultPaddingX(int padding) {
myDefaultPaddingX = padding;
return this;
}
public int getDefaultPaddingX(int column) {
return myDefaultColumnPaddingsX.containsKey(column) ? myDefaultColumnPaddingsX.get(column) : getDefaultPaddingX();
}
@NotNull
public GridBag setDefaultPaddingX(int column, int padding) {
if (padding == -1) {
myDefaultColumnPaddingsX.remove(column);
}
else {
myDefaultColumnPaddingsX.put(column, padding);
}
return this;
}
public int getDefaultPaddingY() {
return myDefaultPaddingY;
}
@NotNull
public GridBag setDefaultPaddingY(int padding) {
myDefaultPaddingY = padding;
return this;
}
public int getDefaultPaddingY(int column) {
return myDefaultColumnPaddingsY.containsKey(column) ? myDefaultColumnPaddingsY.get(column) : getDefaultPaddingY();
}
@NotNull
public GridBag setDefaultPaddingY(int column, int padding) {
if (padding == -1) {
myDefaultColumnPaddingsY.remove(column);
}
else {
myDefaultColumnPaddingsY.put(column, padding);
}
return this;
}
@Nullable
public Insets getDefaultInsets() {
return myDefaultInsets;
}
@NotNull
public GridBag setDefaultInsets(int top, int left, int bottom, int right) {
return setDefaultInsets(new Insets(top, left, bottom, right));
}
public GridBag setDefaultInsets(@Nullable Insets insets) {
myDefaultInsets = insets;
return this;
}
@Nullable
public Insets getDefaultInsets(int column) {
return myDefaultColumnInsets.containsKey(column) ? myDefaultColumnInsets.get(column) : getDefaultInsets();
}
@NotNull
public GridBag setDefaultInsets(int column, int top, int left, int bottom, int right) {
return setDefaultInsets(column, new Insets(top, left, bottom, right));
}
@NotNull
public GridBag setDefaultInsets(int column, @Nullable Insets insets) {
if (insets == null) {
myDefaultColumnInsets.remove(column);
}
else {
myDefaultColumnInsets.put(column, insets);
}
return this;
}
}