OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Rev 17 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright 2011-2019 OpenConcerto, by ILM Informatique. All rights reserved.
 * 
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
 * language governing permissions and limitations under the License.
 * 
 * When distributing the software, include this License Header Notice in each file.
 */
 
 /*
 * Created on 31 oct. 2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package org.openconcerto.ui;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Insets;

/**
 * VFlowLayout is similair to FlowLayout except it lays out components
 * vertically. Extends FlowLayout because it mimics much of the
 * behavior of the FlowLayout class, except vertically. An additional
 * feature is that you can specify a fill to edge flag, which causes
 * the VFlowLayout manager to resize all components to expand to the
 * column width Warning: This causes problems when the main panel
 * has less space that it needs and it seems to prohibit multi-column
 * output
 * @author Larry Schuler
 * @version 1.0, 1/1/96
 * @author based on FLowLayout by AVH.
 */
public class VFlowLayout extends FlowLayout {

    public static final int TOP         = 0;
    public static final int MIDDLE      = 1;
    public static final int BOTTOM      = 2;

    int align;
    int hgap;
    int vgap;
        boolean fill;

    /**
     * Construct a new VFlowLayout with a middle alignemnt, and 
         * the fill to edge flag set.
     */

    public VFlowLayout() {
                this(MIDDLE, 0, 0, true);
    }

        /** 
         * Construct a new VFlowLayout with a middle alignemnt.
         * @param fill the fill to edge flag
         */
        public VFlowLayout(boolean fill){
                this(MIDDLE, 5, 5, fill);
        }

    /**
         * Construct a new VFlowLayout with a middle alignemnt.
     * @param align the alignment value
     */
    public VFlowLayout(int align) {
                this(align, 5, 5, true);
    }

        /**
         * Construct a new VFlowLayout.
         * @param align the alignment value
         * @param fill the fill to edge flag
         */
    public VFlowLayout(int align, boolean fill) {
                this(align, 5, 5, fill);
    }

    /**
         * Construct a new VFlowLayout.
         * @param align the alignment value
         * @param hgap the horizontal gap variable
         * @param vgap the vertical gap variable
         * @param fill the fill to edge flag
     */
    public VFlowLayout(int align, int hgap, int vgap, boolean fill) {
                this.align = align;
                this.hgap = hgap;
                this.vgap = vgap;
                this.fill = fill;
    }

    /**
     * Returns the preferred dimensions given the components
     * in the target container.
     * @param target the component to lay out
     */
    public Dimension preferredLayoutSize(Container target) {
                Dimension tarsiz = new Dimension(0, 0);

                for (int i = 0 ; i < target.getComponentCount(); i++) {
                Component m = target.getComponent(i);
                if (m.isVisible()) {
                                Dimension d = m.getPreferredSize();
                                tarsiz.width = Math.max(tarsiz.width, d.width);
                                if (i > 0) {
                                tarsiz.height += hgap;
                                }
                                tarsiz.height += d.height;
                }
                }
                Insets insets = target.getInsets();
                tarsiz.width += insets.left + insets.right + hgap*2;
                tarsiz.height += insets.top + insets.bottom + vgap*2;
                return tarsiz;
    }

    /**
     * Returns the minimum size needed to layout the target container
     * @param target the component to lay out 
     */
    public Dimension minimumLayoutSize(Container target) {
                Dimension tarsiz = new Dimension(0, 0);

                for (int i = 0 ; i < target.getComponentCount() ; i++) {
                Component m = target.getComponent(i);
                if (m.isVisible()) {
                                Dimension d = m.getMinimumSize();
                                tarsiz.width = Math.max(tarsiz.width, d.width);
                                if (i > 0) {
                                tarsiz.height += vgap;
                                }
                                tarsiz.height += d.height;
                }
                }
                Insets insets = target.getInsets();
                tarsiz.width += insets.left + insets.right + hgap*2;
                tarsiz.height += insets.top + insets.bottom + vgap*2;
                return tarsiz;
    }

    /** 
         * places the components defined by first to last within the target 
         * container using the bounds box defined
     * @param target the container
     * @param x the x coordinate of the area
     * @param y the y coordinate of the area
     * @param width the width of the area
     * @param height the height of the area
     * @param first the first component of the container to place
     * @param last the last component of the container to place
     */
    private void placethem(Container target, int x, int y, 
                                    int width, int height, 
                                                                int first, int last) {

                if ( align == VFlowLayout.MIDDLE )
                        y += height / 2;
                if ( align == VFlowLayout.BOTTOM )
                        y += height;

                for (int i = first ; i < last ; i++) {
                Component m = target.getComponent(i);
                        Dimension md = m.getSize();
                if (m.isVisible()) {
                                int px = x + (width-md.width)/2;
                                m.setLocation(x + (width-md.width)/2, y );
                                y += vgap + md.height;
                }
                }
    }

    /**
     * Lays out the container. 
     * @param target the container to lay out.
     */
    public void layoutContainer(Container target) {
                Insets insets = target.getInsets();
                int maxheight = target.getSize().height - (insets.top + insets.bottom + vgap*2);
                int maxwidth = target.getSize().width - (insets.left + insets.right + hgap*2);
                int numcomp = target.getComponentCount();
                int x = insets.left + hgap, y = 0;
                int colw = 0, start = 0;

                for (int i = 0 ; i < numcomp ; i++) {
                Component m = target.getComponent(i);
                if (m.isVisible()) {
                                Dimension d = m.getPreferredSize();
                                if ( this.fill ){
                                        m.setSize(maxwidth, d.height);
                                        d.width=maxwidth;
                                } else{
                                        m.setSize(d.width, d.height);
                                }
                        
                                if ( y > maxheight ){
                                        placethem(target, x, insets.top + vgap,
                                                                   colw, maxheight- y, start, i);
                                        y = d.height;
                                        x += hgap + colw;
                                        colw = d.width;
                                        start = i;
                                }else{  
                                        if ( y > 0 ) y+= vgap;
                                        y += d.height;
                                        colw = Math.max(colw, d.width);
                                }
                        }
                }
                placethem(target, x, insets.top + vgap, colw, maxheight - y, start, numcomp);
    }
}