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