org.jboss.tools.common.model.ui.action.CommandBarLayout.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.common.model.ui.action.CommandBarLayout.java

Source

/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is 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:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.common.model.ui.action;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;

public class CommandBarLayout extends Layout {
    private static final int DEFAULT_GAP = 5;
    private static final int DEFAULT_LEFT = 5;
    private static final int DEFAULT_RIGHT = 5;
    private static final int DEFAULT_TOP = 5;
    private static final int DEFAULT_BOTTOM = 5;

    public int buttonWidth = SWT.DEFAULT;
    public int buttonHeight = SWT.DEFAULT;
    public int direction = SWT.HORIZONTAL; ///SWT.VERTICAL;
    public int gap = SWT.DEFAULT;
    public int top = SWT.DEFAULT, left = SWT.DEFAULT, bottom = SWT.DEFAULT, right = SWT.DEFAULT;
    public boolean iconsOnly = false;
    public boolean asToolBar = false;
    public int alignment = SWT.LEFT; /// SWT.RIGHT

    public void setMargins(int top, int left, int bottom, int right) {
        this.top = top;
        this.left = left;
        this.bottom = bottom;
        this.right = right;
    }

    protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
        int w = left() + right();
        int h = top() + bottom();
        Control[] cs = composite.getChildren();
        if (cs == null || cs.length == 0) {
            int width = left() + right() + ((buttonWidth != SWT.DEFAULT) ? buttonWidth : 0);
            int height = top() + bottom() + ((buttonHeight != SWT.DEFAULT) ? buttonHeight : 0);
            return new Point(width, height);
        }
        int bw = computeButtonWidth(cs);
        int bh = computeButtonHeight(cs);
        if (direction == SWT.HORIZONTAL) {
            w = w + (cs.length - 1) * gap() + cs.length * bw;
            h = h + bh;
        } else {
            w = w + bw;
            h = h + (cs.length - 1) * gap() + cs.length * bh;
        }
        return new Point(w, h);
    }

    protected void layout(Composite composite, boolean flushCache) {
        Point size = composite.getSize();
        Point s = computeSize(composite, SWT.DEFAULT, SWT.DEFAULT, false);
        Control[] cs = composite.getChildren();
        int bw = computeButtonWidth(cs);
        int bh = computeButtonHeight(cs);
        int x = left(), y = top(), dx = gap() + bw, dy = gap() + bh;
        if (alignment == SWT.RIGHT) {
            x = size.x - s.x + left();
        }
        if (direction == SWT.HORIZONTAL) {
            for (int i = 0; i < cs.length; i++) {
                cs[i].setBounds(x, y, bw, bh);
                x += dx;
            }
        } else {
            for (int i = 0; i < cs.length; i++) {
                cs[i].setBounds(x, y, bw, bh);
                y += dy;
            }
        }
    }

    private int computeButtonHeight(Control[] cs) {
        if ((buttonHeight != SWT.DEFAULT) && (!iconsOnly))
            return buttonHeight; // ignore custom button height
        int height = 0;
        for (int i = 0; i < cs.length; i++) {
            int h = cs[i].computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
            if (iconsOnly)
                h -= 6;
            height = Math.max(h, height);
        }
        return height;
    }

    private int computeButtonWidth(Control[] cs) {
        if ((buttonWidth != SWT.DEFAULT) && (!iconsOnly))
            return buttonWidth; // ignore custom button width         
        int width = 0;
        for (int i = 0; i < cs.length; i++) {
            int w = cs[i].computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
            if (iconsOnly)
                w -= 6;
            width = Math.max(w, width);
            if (!iconsOnly) {
                int w1 = convertHorizontalDLUsToPixels(cs[i], IDialogConstants.BUTTON_WIDTH);
                width = Math.max(w1, width);
            }
        }
        return width;
    }

    protected int convertHorizontalDLUsToPixels(Control control, int dlus) {
        GC gc = new GC(control);
        gc.setFont(control.getFont());
        int averageWidth = gc.getFontMetrics().getAverageCharWidth();
        gc.dispose();

        double horizontalDialogUnitSize = averageWidth * 0.25;

        return (int) Math.round(dlus * horizontalDialogUnitSize);
    }

    private int top() {
        return (top != SWT.DEFAULT) ? top : DEFAULT_TOP;
    }

    private int left() {
        return (left != SWT.DEFAULT) ? left : DEFAULT_LEFT;
    }

    private int bottom() {
        return (bottom != SWT.DEFAULT) ? bottom : DEFAULT_BOTTOM;
    }

    private int right() {
        return (right != SWT.DEFAULT) ? right : DEFAULT_RIGHT;
    }

    private int gap() {
        return (gap != SWT.DEFAULT) ? gap : DEFAULT_GAP;
    }
}