net.pms.util.FormLayoutUtil.java Source code

Java tutorial

Introduction

Here is the source code for net.pms.util.FormLayoutUtil.java

Source

/*
 * PS3 Media Server, for streaming any medias to your PS3.
 * Copyright (C) 2008  A.Brochard
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; version 2
 * of the License only.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package net.pms.util;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormSpec.DefaultAlignment;

import java.awt.*;

/**
 * Provides some convenience behavior for flipping side in column
 * specifications, arrays of column specifications and encoded column specs.
 * This can be used to flip the FormLayout from the default left-to-right
 * definition to right-to-left.
 * 
 * Based on the jgoodies ComponenOrientationExample tutorial code.
 */
public class FormLayoutUtil {

    /**
     * Flips the default alignment of the given column specification and returns
     * a new column specification object with the flipped alignment and the same
     * size and growing behavior as the original.
     * 
     * @param spec
     *            the original column specification
     * @return the column specification with flipped default alignment
     */
    private static ColumnSpec flipped(ColumnSpec spec) {
        DefaultAlignment alignment = spec.getDefaultAlignment();

        if (alignment == ColumnSpec.LEFT) {
            alignment = ColumnSpec.RIGHT;
        } else {
            if (alignment == ColumnSpec.RIGHT) {
                alignment = ColumnSpec.LEFT;
            }
        }

        return new ColumnSpec(alignment, spec.getSize(), spec.getResizeWeight());
    }

    /**
     * Returns an array of column specifications that is built from the given
     * array by flipping each column spec and reversing their order.
     * 
     * @param original
     *            the original array of column specifications
     * @return an array of flipped column specs in reversed order
     */
    private static ColumnSpec[] flipped(ColumnSpec[] original) {
        int length = original.length;
        ColumnSpec[] flipped = new ColumnSpec[length];

        for (int i = 0; i < length; i++) {
            flipped[i] = flipped(original[length - 1 - i]);
        }
        return flipped;
    }

    /**
     * Returns an array of column specifications that is built from the given
     * encoded column specifications by flipping each column spec and reversing
     * their order.
     * 
     * @param encodedColumnSpecs
     *            the original comma-separated encoded column specifications
     * @return an array of flipped column specs in reversed order
     */
    private static ColumnSpec[] flipped(String encodedColumnSpecs) {
        return flipped(ColumnSpec.decodeSpecs(encodedColumnSpecs));
    }

    /**
     * Returns an array of column specifications that is built from the given
     * encoded column specifications by flipping each column spec and reversing
     * their order.
     * 
     * @param encodedColumnSpecs
     *            the original comma-separated encoded column specifications
     * @return an array of flipped column specs in reversed order
     */
    public static String flip(String encodedColumnSpecs) {
        StringBuffer result = new StringBuffer();
        String separator = "";
        ColumnSpec[] flippedSpecs = flipped(ColumnSpec.decodeSpecs(encodedColumnSpecs));

        for (ColumnSpec spec : flippedSpecs) {
            result.append(separator);
            result.append(spec.encode());
            separator = ", ";
        }

        return result.toString();
    }

    /**
     * Creates and returns a horizontally flipped clone of the given cell
     * constraints object. Flips the horizontal alignment and the left and right
     * insets.
     * 
     * @param cc
     *            the original cell constraints object
     * @return the flipped cell constraints with flipped horizontal alignment,
     *         and flipped left and right insets - if any
     */
    private static CellConstraints flipHorizontally(CellConstraints cc) {
        CellConstraints.Alignment flippedHAlign = cc.hAlign;

        if (flippedHAlign == CellConstraints.LEFT) {
            flippedHAlign = CellConstraints.RIGHT;
        } else {
            if (flippedHAlign == CellConstraints.RIGHT) {
                flippedHAlign = CellConstraints.LEFT;
            }
        }

        CellConstraints flipped = new CellConstraints(cc.gridX, cc.gridY, cc.gridWidth, cc.gridHeight,
                flippedHAlign, cc.vAlign);

        if (cc.insets != null) {
            flipped.insets = new Insets(cc.insets.top, cc.insets.right, cc.insets.bottom, cc.insets.left);
        }

        return flipped;
    }

    /**
     * Creates and returns a horizontally flipped clone of the given cell
     * constraints object with the grid position adjusted to the given column
     * count. Flips the horizontal alignment and the left and right insets. And
     * swaps the left and right cell positions according to the specified column
     * count.
     * 
     * @param cc
     *            the original cell constraints object
     * @param columnCount
     *            the number of columns; used to swap the left and right cell
     *            bounds
     * @return the flipped cell constraints with flipped horizontal alignment,
     *         and flipped left and right insets - if any
     */
    private static CellConstraints flipHorizontally(CellConstraints cc, int columnCount) {
        CellConstraints flipped = flipHorizontally(cc);
        flipped.gridX = columnCount + 1 - cc.gridX - cc.gridWidth + 1;

        return flipped;
    }

    /**
     * Returns the proper column specification for the given component
     * orientation. The column specification is provided in left-to-right
     * format. When the orientation is left-to-right, the string is returned as
     * is. Otherwise the string is reworked to represent right-to-left.
     * 
     * @param leftToRightColSpec
     *            The column specification for a left-to-right orientation.
     * @param orientation
     *            The orientation of the locale.
     * @return The proper column specification.
     */
    public static String getColSpec(String leftToRightColSpec, ComponentOrientation orientation) {
        if (orientation.isLeftToRight()) {
            return leftToRightColSpec;
        } else {
            return FormLayoutUtil.flip(leftToRightColSpec);
        }
    }

    /**
     * Returns the proper cell constraints for the given column specification
     * and orientation. This means that when the orientation is left-to-right,
     * the cell constraints are returned as is. When it is right-to-left, the
     * cell constraints are flipped horizontally.
     * 
     * @param cc
     *            The cell constraints defined in left-to-right format.
     * @param colSpec
     *            The column specification for which the cell constraints are
     *            designed.
     * @param orientation
     *            The orientation of the locale.
     * @return The proper cell constraints.
     */
    public static CellConstraints flip(CellConstraints cc, String colSpec, ComponentOrientation orientation) {
        if (orientation.isLeftToRight()) {
            return cc;
        } else {
            int columnCount = colSpec.split(",").length;
            return flipHorizontally(cc, columnCount);
        }
    }
}