name.schedenig.eclipse.grepconsole.util.GridLayoutBuilder.java Source code

Java tutorial

Introduction

Here is the source code for name.schedenig.eclipse.grepconsole.util.GridLayoutBuilder.java

Source

/*******************************************************************************
 * Copyright (c) 2008 - 2014 Marian Schedenig
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Marian Schedenig - initial API and implementation
 *******************************************************************************/

package name.schedenig.eclipse.grepconsole.util;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * Builder for grid layout instances. Left, right, top and bottom margins are
 * automatically initialised to the correct dialogue margins based on the 
 * current font. Horizontal and vertical margins are set to 0.
 *
 * Calls to setter methods return the builder instance and can therefore be
 * chained.
 * 
 * @author msched
 */
public class GridLayoutBuilder {
    /** Created layout. */
    private GridLayout layout;

    /** Font metrics used for standard margins. */
    private FontMetrics fontMetrics;

    /** Control providing the current font. */
    private Composite control;

    /**
     * Returns the font metrics for the specified control.
     * 
     * @param control Control.
     * 
     * @return
     */
    private static FontMetrics getFontMetrics(Control control) {
        GC gc = new GC(control);

        try {
            gc.setFont(control.getFont());
            return gc.getFontMetrics();
        } finally {
            gc.dispose();
        }
    }

    /**
     * Creates a new instance.
     * 
     * @param control Control for which the layout is created.
     * @param numColumns Number of columns.
     * @param makeColumnsEqualWidth Whether to make all columns equally wide.
     */
    public GridLayoutBuilder(Composite control, int numColumns, boolean makeColumnsEqualWidth) {
        this(control, getFontMetrics(control));

        setNumColumns(numColumns);
        setMakeColumnsEqualWidth(makeColumnsEqualWidth);
    }

    /**
     * Creates a new instance.
     * 
     * @param control Control for which the layout is created.
     */
    public GridLayoutBuilder(Composite control) {
        this(control, getFontMetrics(control));
    }

    /**
     * Creates a new instance.
     * 
     * @param fontMetrics Font metrics to use for default margins.
     */
    public GridLayoutBuilder(FontMetrics fontMetrics) {
        this(null, fontMetrics);
    }

    /**
     * Creates a new instance.
     * 
     * @param control Control for which the layout is created.
     * @param fontMetrics Font metrics to use for default margins.
     */
    public GridLayoutBuilder(Composite control, FontMetrics fontMetrics) {
        this.control = control;
        this.fontMetrics = fontMetrics;

        init();
    }

    /**
     * Initialises the layout and its margins based on the current font.
     */
    private void init() {
        layout = new GridLayout();

        if (fontMetrics != null) {
            layout.marginHeight = Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.VERTICAL_MARGIN);
            layout.marginWidth = Dialog.convertHorizontalDLUsToPixels(fontMetrics,
                    IDialogConstants.HORIZONTAL_MARGIN);
            layout.verticalSpacing = Dialog.convertVerticalDLUsToPixels(fontMetrics,
                    IDialogConstants.VERTICAL_SPACING);
            layout.horizontalSpacing = Dialog.convertHorizontalDLUsToPixels(fontMetrics,
                    IDialogConstants.HORIZONTAL_SPACING);
        }

        layout.marginLeft = layout.marginRight = layout.marginWidth;
        layout.marginTop = layout.marginBottom = layout.marginHeight;
        layout.marginWidth = layout.marginHeight = 0;
    }

    /**
     * Returns the layout.
     * 
     * @return Layout.
     */
    public GridLayout getLayout() {
        return layout;
    }

    /**
     * Applies the layout to the control.
     */
    public void apply() {
        control.setLayout(layout);
    }

    /**
     * Sets the number of columns.
     * 
     * @param numColumns Number of columns.
     * 
     * @return This builder instance.
     */
    public GridLayoutBuilder setNumColumns(int numColumns) {
        layout.numColumns = numColumns;
        return this;
    }

    /**
     * Sets whether columns are equally wide.
     * 
     * @param makeColumnsEqualWidth Whether columns are equally wide.
     *  
     * @return This builder instance.
     */
    public GridLayoutBuilder setMakeColumnsEqualWidth(boolean makeColumnsEqualWidth) {
        layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
        return this;
    }

    /**
     * Sets the top and bottom margins.
     * 
     * @param marginHeight Margin in pixels.
     * 
     * @return This builder instance.
     */
    public GridLayoutBuilder setMarginHeight(int marginHeight) {
        layout.marginTop = layout.marginBottom = marginHeight;
        return this;
    }

    /**
     * Sets the left and right margins.
     * 
     * @param marginWidth Margin in pixels.
     * 
     * @return This builder instance.
     */
    public GridLayoutBuilder setMarginWidth(int marginWidth) {
        layout.marginLeft = layout.marginRight = marginWidth;
        return this;
    }

    /**
     * Sets the left margin.
     * 
     * @param marginLeft Margin in pixels.
     * 
     * @return This builder instance.
     */
    public GridLayoutBuilder setMarginLeft(int marginLeft) {
        layout.marginLeft = marginLeft;
        return this;
    }

    /**
     * Sets the top margin.
     * 
     * @param marginTop Margin in pixels.
     * 
     * @return This builder instance.
     */
    public GridLayoutBuilder setMarginTop(int marginTop) {
        layout.marginTop = marginTop;
        return this;
    }

    /**
     * Sets the right margin.
     * 
     * @param marginRight Margin in pixels.
     * 
     * @return This builder instance.
     */
    public GridLayoutBuilder setMarginRight(int marginRight) {
        layout.marginRight = marginRight;
        return this;
    }

    /**
     * Sets the bottom margin.
     * 
     * @param marginBottom Margin in pixels.
     * 
     * @return This builder instance.
     */
    public GridLayoutBuilder setMarginBottom(int marginBottom) {
        layout.marginBottom = marginBottom;
        return this;
    }

    /**
     * Sets the horizontal spacing.
     * 
     * @param horizontalSpacing Spacing in pixels.
     * 
     * @return
     */
    public GridLayoutBuilder setHorizontalSpacing(int horizontalSpacing) {
        layout.horizontalSpacing = horizontalSpacing;
        return this;
    }

    /**
     * Sets the vertical spacing.
     * 
     * @param verticalSpacing Spacing in pixels.
     * 
     * @return This builder instance.
     */
    public GridLayoutBuilder setVerticalSpacing(int verticalSpacing) {
        layout.verticalSpacing = verticalSpacing;
        return this;
    }

    /**
     * Sets all margins.
     * 
     * @param margins Margin in pixels.
     * 
     * @return This builder instance.
     */
    public GridLayoutBuilder setMargins(int margins) {
        return setMarginWidth(margins).setMarginHeight(margins);
    }
}