de.walware.ecommons.ui.util.LayoutUtil.java Source code

Java tutorial

Introduction

Here is the source code for de.walware.ecommons.ui.util.LayoutUtil.java

Source

/*=============================================================================#
 # Copyright (c) 2007-2015 Stephan Wahlbrink (WalWare.de) and others.
 # 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:
 #     Stephan Wahlbrink - initial API and implementation
 #=============================================================================*/

package de.walware.ecommons.ui.util;

import java.util.Collection;

import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;

import de.walware.ecommons.collections.ImCollections;

public class LayoutUtil {

    private static class DialogValues {

        int defaultEntryFieldWidth;

        int defaultHMargin;
        int defaultVMargin;
        int defaultHSpacing;
        int defaultVSpacing;
        int defaultIndent;
        int defaultSmallIndent;

        public DialogValues() {
            final GC gc = new GC(Display.getCurrent());
            gc.setFont(JFaceResources.getDialogFont());
            final FontMetrics fontMetrics = gc.getFontMetrics();

            defaultHMargin = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.HORIZONTAL_MARGIN);
            defaultVMargin = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.VERTICAL_MARGIN);
            defaultHSpacing = Dialog.convertHorizontalDLUsToPixels(fontMetrics,
                    IDialogConstants.HORIZONTAL_SPACING);
            defaultVSpacing = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.VERTICAL_SPACING);
            defaultEntryFieldWidth = Dialog.convertHorizontalDLUsToPixels(fontMetrics,
                    IDialogConstants.ENTRY_FIELD_WIDTH);
            defaultIndent = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.INDENT);
            defaultSmallIndent = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.SMALL_INDENT);

            gc.dispose();
        }
    }

    private static DialogValues gDialogValues;

    private static DialogValues getDialogValues() {
        if (gDialogValues == null) {
            JFaceResources.getFontRegistry().addListener(new IPropertyChangeListener() {
                @Override
                public void propertyChange(final PropertyChangeEvent event) {
                    if (JFaceResources.DIALOG_FONT.equals(event.getProperty())) {
                        UIAccess.getDisplay().asyncExec(new Runnable() {
                            @Override
                            public void run() {
                                gDialogValues = new DialogValues();
                            }
                        });
                    }
                }
            });
            gDialogValues = new DialogValues();
        }
        return gDialogValues;
    }

    public static int defaultHMargin() {
        return getDialogValues().defaultHMargin;
    }

    public static int defaultVMargin() {
        return getDialogValues().defaultVMargin;
    }

    public static Point defaultSpacing() {
        return new Point(getDialogValues().defaultHSpacing, getDialogValues().defaultVSpacing);
    }

    public static int defaultHSpacing() {
        return getDialogValues().defaultHSpacing;
    }

    public static int defaultVSpacing() {
        return getDialogValues().defaultVSpacing;
    }

    public static int defaultIndent() {
        return getDialogValues().defaultIndent;
    }

    public static int defaultSmallIndent() {
        return getDialogValues().defaultSmallIndent;
    }

    public static int hintWidth(final Button button) {
        button.setFont(JFaceResources.getFontRegistry().get(JFaceResources.DIALOG_FONT));
        final PixelConverter converter = new PixelConverter(button);
        final int widthHint = converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
    }

    public static GridData hintWidth(final GridData gd, final Button button) {
        gd.widthHint = hintWidth(button);
        return gd;
    }

    public static int hintWidth(final Text text, final int numChars) {
        return hintWidth(text, JFaceResources.DIALOG_FONT, numChars);
    }

    public static GridData hintWidth(final GridData gd, final Text text, final int numChars) {
        gd.widthHint = hintWidth(text, JFaceResources.DIALOG_FONT, numChars);
        return gd;
    }

    public static int hintWidth(final Text text, final String symbolicName, final int numChars) {
        if (symbolicName != null) {
            text.setFont(JFaceResources.getFontRegistry().get(symbolicName));
        }
        if (numChars == -1) {
            return getDialogValues().defaultEntryFieldWidth;
        }
        final PixelConverter converter = new PixelConverter(text);
        final int widthHint = converter.convertWidthInCharsToPixels(numChars);
        return widthHint;
    }

    public static int hintWidth(final StyledText text, final String symbolicName, final int numChars) {
        if (symbolicName != null) {
            text.setFont(JFaceResources.getFontRegistry().get(symbolicName));
        }
        if (numChars == -1) {
            return getDialogValues().defaultEntryFieldWidth;
        }
        final PixelConverter converter = new PixelConverter(text);
        final int widthHint = converter.convertWidthInCharsToPixels(numChars);
        return widthHint;
    }

    public static int hintWidth(final Combo combo, final int numChars) {
        return hintWidth(combo, JFaceResources.DIALOG_FONT, numChars);
    }

    public static int hintWidth(final Combo combo, final String fontName, final int numChars) {
        combo.setFont(JFaceResources.getFontRegistry().get(fontName));
        if (numChars == -1) {
            return getDialogValues().defaultEntryFieldWidth;
        }
        final PixelConverter converter = new PixelConverter(combo);
        int widthHint = converter.convertWidthInCharsToPixels(numChars + 1);

        final Rectangle trim = combo.computeTrim(0, 0, widthHint, 0);
        if (trim.width > widthHint) {
            widthHint = trim.width;
        } else if ((combo.getStyle() & SWT.DROP_DOWN) == SWT.DROP_DOWN) {
            final Button button = new Button(combo.getParent(), SWT.ARROW | SWT.DOWN);
            widthHint += button.computeSize(SWT.DEFAULT, SWT.DEFAULT).x + 2;
            button.dispose();
            //         widthHint += combo.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
        }

        return widthHint;
    }

    public static GridData hintWidth(final GridData gd, final Combo combo, final int numChars) {
        return hintWidth(gd, combo, JFaceResources.DIALOG_FONT, numChars);
    }

    public static GridData hintWidth(final GridData gd, final Combo combo, final String fontName,
            final int numChars) {
        gd.widthHint = hintWidth(combo, fontName, numChars);
        return gd;
    }

    public static int hintWidth(final Combo combo, final String[] items) {
        return hintWidth(combo, ImCollections.newList(items));
    }

    public static int hintWidth(final Combo combo, final Collection<String> items) {
        int max = 0;
        for (final String s : items) {
            max = Math.max(max, s.length());
        }
        return hintWidth(combo, JFaceResources.DIALOG_FONT, max);
    }

    public static int hintWidth(final Combo combo, final java.util.List<Object> input,
            final ILabelProvider labelProvider) {
        combo.setFont(JFaceResources.getFontRegistry().get(JFaceResources.DIALOG_FONT));
        final GC gc = new GC(combo);
        int widthHint = 0;
        for (final Object o : input) {
            final String s = labelProvider.getText(o);
            if (s != null) {
                widthHint = Math.max(widthHint, gc.stringExtent(s).x);
            }
        }
        gc.dispose();

        final Rectangle trim = combo.computeTrim(0, 0, widthHint, 0);
        if (trim.width > widthHint) {
            widthHint = trim.width;
        }

        return widthHint;
    }

    public static int hintWidth(final Table table, final int numChars) {
        return hintWidth(table, JFaceResources.DIALOG_FONT, false, numChars);
    }

    public static int hintWidth(final Table table, final String fontName, final boolean icon, final int numChars) {
        if (fontName != null) {
            table.setFont(JFaceResources.getFontRegistry().get(fontName));
        }
        final PixelConverter converter = new PixelConverter(table);
        int width = converter.convertWidthInCharsToPixels(numChars);
        {
            final ScrollBar scrollBar = table.getVerticalBar();
            if (scrollBar != null) {
                width += scrollBar.getSize().x;
            }
        }
        if ((table.getStyle() & SWT.CHECK) == SWT.CHECK) {
            width += 16 + converter.convertHorizontalDLUsToPixels(4) + converter.convertWidthInCharsToPixels(1);
        }
        if (icon) {
            width += 16 + converter.convertHorizontalDLUsToPixels(4);
        }
        return width;
    }

    public static int hintWidth(final Table table, final Collection<String> items) {
        int max = 0;
        for (final String s : items) {
            max = Math.max(max, s.length());
        }
        return hintWidth(table, max);
    }

    public static int hintWidth(final Table table, final Object[] input, final ILabelProvider labelProvider) {
        int max = 0;
        for (final Object o : input) {
            final String s = labelProvider.getText(o);
            if (s != null) {
                max = Math.max(max, s.length());
            }
        }
        return hintWidth(table, max);
    }

    public static int hintColWidth(final Table table, final int numChars) {
        table.setFont(JFaceResources.getFontRegistry().get(JFaceResources.DIALOG_FONT));
        final PixelConverter converter = new PixelConverter(table);
        final int width = converter.convertWidthInCharsToPixels(numChars);
        return width;
    }

    public static int hintHeight(final List control, final int rows) {
        control.setFont(JFaceResources.getFontRegistry().get(JFaceResources.DIALOG_FONT));
        return control.getItemHeight() * rows;
    }

    public static int hintHeight(final Tree control, final int rows) {
        return hintHeight(control, rows, true);
    }

    public static int hintHeight(final Tree control, final int rows, final boolean withScrollbar) {
        control.setFont(JFaceResources.getFontRegistry().get(JFaceResources.DIALOG_FONT));

        int height = control.getHeaderHeight();
        height += control.getItemHeight() * rows;

        if (!withScrollbar && Platform.getWS().equals(Platform.WS_WIN32)) {
            final ScrollBar hBar = control.getHorizontalBar();
            if (hBar != null) {
                height -= hBar.getSize().y;
            }
        } else if (Platform.getWS().equals(Platform.WS_WIN32)) {
            height += control.getBorderWidth() * 2;
        }

        return height;
    }

    public static int hintHeight(final Table control, final int rows) {
        return hintHeight(control, rows, true);
    }

    public static int hintHeight(final Table control, final int rows, final boolean withScrollbar) {
        control.setFont(JFaceResources.getFontRegistry().get(JFaceResources.DIALOG_FONT));

        int height = control.getHeaderHeight();
        height += control.getItemHeight() * rows;

        if (!withScrollbar && Platform.getWS().equals(Platform.WS_WIN32)) {
            final ScrollBar hBar = control.getHorizontalBar();
            if (hBar != null) {
                height -= hBar.getSize().y;
            }
        } else if (Platform.getWS().equals(Platform.WS_WIN32)) {
            height += control.getBorderWidth() * 2;
        }

        return height;
    }

    public static int hintHeight(final Label control, final int lines) {
        final PixelConverter converter = new PixelConverter(control);
        return converter.convertHeightInCharsToPixels(lines);
    }

    public static int hintHeight(final StyledText control, final int lines) {
        final PixelConverter converter = new PixelConverter(control);
        return converter.convertHeightInCharsToPixels(lines);
    }

    public static GridData createGD(final Button button) {
        final GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false);
        gd.widthHint = hintWidth(button);
        return gd;
    }

    public static GridLayout createDialogGrid(final int numColumns) {
        final GridLayout gl = new GridLayout(numColumns, false);
        gl.numColumns = numColumns;
        applyDialogDefaults(gl);
        return gl;
    }

    public static GridLayout applyDialogDefaults(final GridLayout gl, final int numColumns) {
        gl.numColumns = numColumns;
        applyDialogDefaults(gl);
        return gl;
    }

    public static GridLayout applyDialogDefaults(final GridLayout gl) {
        final DialogValues dialogValues = getDialogValues();
        gl.marginWidth = dialogValues.defaultHMargin;
        gl.marginHeight = dialogValues.defaultVMargin;
        gl.horizontalSpacing = dialogValues.defaultHSpacing;
        gl.verticalSpacing = dialogValues.defaultVSpacing;
        return gl;
    }

    @Deprecated
    public static GridLayout applyCompositeDefaults(final GridLayout gl, final int numColumns) {
        gl.numColumns = numColumns;
        applyCompositeDefaults(gl);
        return gl;
    }

    public static GridLayout applyCompositeDefaults(final GridLayout gl) {
        final DialogValues dialogValues = getDialogValues();
        gl.marginWidth = 0;
        gl.marginHeight = 0;
        gl.horizontalSpacing = dialogValues.defaultHSpacing;
        gl.verticalSpacing = dialogValues.defaultVSpacing;
        return gl;
    }

    public static GridLayout createCompositeGrid(final int numColumns) {
        final GridLayout gl = new GridLayout(numColumns, false);
        applyCompositeDefaults(gl);
        return gl;
    }

    public static GridLayout createCompositeGrid(final int numColumns, final boolean equalWidth) {
        final GridLayout gl = new GridLayout(numColumns, equalWidth);
        applyCompositeDefaults(gl);
        return gl;
    }

    @Deprecated
    public static GridLayout applyGroupDefaults(final GridLayout gl, final int numColumns) {
        gl.numColumns = numColumns;
        applyGroupDefaults(gl);
        return gl;
    }

    public static GridLayout applyGroupDefaults(final GridLayout gl) {
        final DialogValues dialogValues = getDialogValues();
        gl.marginWidth = dialogValues.defaultHSpacing;
        gl.marginHeight = dialogValues.defaultVSpacing;
        gl.horizontalSpacing = dialogValues.defaultHSpacing;
        gl.verticalSpacing = dialogValues.defaultVSpacing;
        return gl;
    }

    public static GridLayout createGroupGrid(final int numColumns) {
        final GridLayout gl = new GridLayout(numColumns, false);
        applyGroupDefaults(gl);
        return gl;
    }

    public static GridLayout createGroupGrid(final int numColumns, final boolean equalWidth) {
        final GridLayout gl = new GridLayout(numColumns, equalWidth);
        applyGroupDefaults(gl);
        return gl;
    }

    public static GridLayout applyContentDefaults(final GridLayout gl) {
        final DialogValues dialogValues = getDialogValues();
        gl.marginWidth = dialogValues.defaultHSpacing;
        gl.marginHeight = dialogValues.defaultVSpacing;
        gl.horizontalSpacing = dialogValues.defaultHSpacing;
        gl.verticalSpacing = dialogValues.defaultVSpacing;
        return gl;
    }

    public static GridLayout createContentGrid(final int numColumns) {
        final GridLayout gl = new GridLayout(numColumns, false);
        applyContentDefaults(gl);
        return gl;
    }

    public static GridLayout createContentGrid(final int numColumns, final boolean equalWidth) {
        final GridLayout gl = new GridLayout(numColumns, equalWidth);
        applyContentDefaults(gl);
        return gl;
    }

    @Deprecated
    public static GridLayout applyTabDefaults(final GridLayout gl, final int numColumns) {
        gl.numColumns = numColumns;
        applyTabDefaults(gl);
        return gl;
    }

    public static GridLayout applyTabDefaults(final GridLayout gl) {
        final DialogValues dialogValues = getDialogValues();
        gl.marginWidth = dialogValues.defaultHSpacing;
        gl.marginHeight = dialogValues.defaultVSpacing;
        gl.horizontalSpacing = dialogValues.defaultHSpacing;
        gl.verticalSpacing = dialogValues.defaultVSpacing;
        return gl;
    }

    public static GridLayout createTabGrid(final int numColumns) {
        final GridLayout gl = new GridLayout(numColumns, false);
        applyTabDefaults(gl);
        return gl;
    }

    public static GridLayout createTabGrid(final int numColumns, final boolean equalWidth) {
        final GridLayout gl = new GridLayout(numColumns, equalWidth);
        applyTabDefaults(gl);
        return gl;
    }

    public static FillLayout applyTabDefaults(final FillLayout fl) {
        final DialogValues dialogValues = getDialogValues();
        fl.marginWidth = dialogValues.defaultHSpacing;
        fl.marginHeight = dialogValues.defaultVSpacing;
        fl.spacing = (fl.type == SWT.HORIZONTAL) ? dialogValues.defaultHSpacing : dialogValues.defaultVSpacing;
        return fl;
    }

    public static GridLayout applySashDefaults(final GridLayout gl, final int numColumns) {
        gl.numColumns = numColumns;
        gl.marginWidth = 0;
        gl.marginHeight = 0;
        gl.horizontalSpacing = 0;
        gl.verticalSpacing = 0;
        return gl;
    }

    public static void addGDDummy(final Composite composite) {
        addGDDummy(composite, false);
    }

    public static void addGDDummy(final Composite composite, final boolean grab) {
        final Label dummy = new Label(composite, SWT.NONE);
        dummy.setVisible(false);
        dummy.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, grab, false));
    }

    public static void addGDDummy(final Composite composite, final boolean grab, final int span) {
        final Label dummy = new Label(composite, SWT.NONE);
        dummy.setVisible(false);
        dummy.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, grab, false, span, 1));
    }

    /**
     * Adds a small vertical space (filler) to the given composite
     * 
     * @param composite The composite to add the filler to
     * @param grab Whether the filler should grap vertical space
     */
    public static void addSmallFiller(final Composite composite, final boolean grab) {
        final Label filler = new Label(composite, SWT.NONE);
        final Layout layout = composite.getLayout();
        if (layout instanceof GridLayout) {
            final GridData gd = new GridData(SWT.FILL, SWT.FILL, false, grab);
            gd.horizontalSpan = ((GridLayout) layout).numColumns;
            gd.heightHint = defaultVSpacing() / 2;
            filler.setLayoutData(gd);
        }
    }

    private LayoutUtil() {
    }

}