blob: 800ce33d0211c0515c9931aee5d423df34dea6dd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you 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 org.apache.pivot.wtk;
import org.apache.pivot.util.ListenerList;
/**
* Container that arranges components in a line, either vertically or
* horizontally. <p>Layout considerations: Note that by default, a BoxPane does
* not pass any preferred size information to its components. That means, for
* example, that the preferred width of a horizontal BoxPane is simply the sum
* of the preferred widths of its components, plus whatever extra space is
* dictated by its <code>padding</code> and <code>spacing</code> styles. This is
* also true in the orthogonal dimension if the <code>fill</code> style is not
* set: the preferred height of a horizontal BoxPane is the maximum preferred
* height of its components (plus padding, if any). <p>If a BoxPane is given
* less than its preferred size by its parent container, then the contents will
* be clipped; if given more than its preferred size, the contents will not be
* stretched to fill the space. <p>This behavior of BoxPane can be useful for
* "canceling" the layout effects of a parent container and/or to align a
* component that does not have its own alignment styles. For example, if you
* place a PushButton in a cell of a TablePane, the button will expand to fill
* the whole cell. If instead you place the button inside a BoxPane in the cell,
* it will retain its natural size, and you can set the horizontalAlignment and
* verticalAlignment styles of the BoxPane to, say, center the button within the
* cell. <p> Setting the <code>fill</code> style to true will cause the BoxPane
* to completely fill the space allotted by its container in the direction
* orthogonal to the layout direction. So, for a vertical layout, the width will
* be the width of its container and the children of the BoxPane will also be
* sized accordingly (i.e., full width of the space). And so for a horizontal
* layout, with <code>fill</code> set to true the height of the BoxPane will be
* the height allotted by its container and the children of the BoxPane will
* have their heights set accordingly.
*/
public class BoxPane extends Container {
private static class BoxPaneListenerList extends WTKListenerList<BoxPaneListener> implements
BoxPaneListener {
@Override
public void orientationChanged(BoxPane boxPane) {
for (BoxPaneListener listener : this) {
listener.orientationChanged(boxPane);
}
}
}
private Orientation orientation = null;
private BoxPaneListenerList boxPaneListeners = new BoxPaneListenerList();
public BoxPane() {
this(Orientation.HORIZONTAL);
}
public BoxPane(Orientation orientation) {
setOrientation(orientation);
installSkin(BoxPane.class);
}
public Orientation getOrientation() {
return orientation;
}
public void setOrientation(Orientation orientation) {
if (orientation == null) {
throw new IllegalArgumentException();
}
if (this.orientation != orientation) {
this.orientation = orientation;
boxPaneListeners.orientationChanged(this);
}
}
public ListenerList<BoxPaneListener> getBoxPaneListeners() {
return boxPaneListeners;
}
}