org.eclipse.buckminster.ui.UiUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.buckminster.ui.UiUtils.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2006
 * Thomas Hallgren, Kenneth Olwing, Mitch Sonies
 * Pontus Rydin, Nils Unden, Peer Torngren
 * The code, documentation and other materials contained herein have been
 * licensed under the Eclipse Public License - v 1.0 by the individual
 * copyright holders listed above, as Initial Contributors under such license.
 * The text of such license is available at www.eclipse.org.
 *******************************************************************************/

package org.eclipse.buckminster.ui;

import java.util.NoSuchElementException;
import java.util.SortedMap;
import java.util.TreeMap;

import org.eclipse.buckminster.runtime.BuckminsterException;
import org.eclipse.buckminster.ui.internal.LabeledCombo;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

public class UiUtils {
    /**
     * Combined ModifyListener and SelectionListener that sets combo to its
     * original value. Note: read only combo should be created with
     * SWT.READ_ONLY flag
     * 
     * @author Karel Brezina
     */
    static class ReadOnlyComboSelectionListener implements SelectionListener, ModifyListener {
        SortedMap<Integer, Integer> lastSelectionIndexes = new TreeMap<Integer, Integer>();

        // triggered programmatically and by users - user events need to be
        // filtered out
        @Override
        public void modifyText(ModifyEvent e) {
            lastSelectionIndexes.put(Integer.valueOf(e.time),
                    Integer.valueOf(((Combo) e.widget).getSelectionIndex()));
        }

        @Override
        public void widgetDefaultSelected(SelectionEvent e) {
            // do nothing
        }

        // triggered by users
        @Override
        public void widgetSelected(SelectionEvent e) {
            Integer timeInteger = Integer.valueOf(e.time);
            if (lastSelectionIndexes.get(timeInteger) != null) {
                // recorded by ModifyListener at the same time - the same event
                // - remove it
                lastSelectionIndexes.remove(timeInteger);
            }

            int lastSelectionIndex = 0;
            Integer lastTimeInteger = null;

            try {
                lastTimeInteger = lastSelectionIndexes.lastKey();
            } catch (NoSuchElementException e1) {
                // nothing - lastSelectionIndex is set to null
            }

            if (lastTimeInteger != null) {
                lastSelectionIndex = lastSelectionIndexes.get(lastTimeInteger).intValue();
            }

            ((Combo) e.widget).select(lastSelectionIndex);
        }
    }

    public static Button createCheckButton(Composite parent, String key, boolean readOnly,
            SelectionListener listener) {
        final Button button = new Button(parent, SWT.CHECK);
        if (key != null)
            button.setText(JFaceResources.getString(key));
        button.setFont(parent.getFont());
        if (listener != null)
            button.addSelectionListener(listener);

        if (readOnly)
            button.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    button.setSelection(!button.getSelection());
                }
            });
        return button;

    }

    public static Button createCheckButton(Composite parent, String key, SelectionListener listener) {
        return createCheckButton(parent, key, false, listener);
    }

    public static Label createEmptyLabel(Composite parent) {
        Label lbl = new Label(parent, SWT.NONE);
        lbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
        return lbl;
    }

    public static Composite createEmptyPanel(Composite parent) {
        return createEmptyPanel(parent, ""); //$NON-NLS-1$
    }

    public static Composite createEmptyPanel(Composite parent, String fictiveStringToSetWidth) {
        Composite hlpComposite = new Composite(parent, SWT.NONE);
        hlpComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        StackLayout hlpStackLayout = new StackLayout();
        hlpComposite.setLayout(hlpStackLayout);
        Label hlpEmptyLabel = UiUtils.createEmptyLabel(hlpComposite);
        Text hlpFictiveText = UiUtils.createGridText(hlpComposite, 1, 0, SWT.NONE);
        hlpFictiveText.setText(fictiveStringToSetWidth);
        hlpStackLayout.topControl = hlpEmptyLabel;

        return hlpComposite;
    }

    public static LabeledCombo createEnumCombo(Composite parent, String labelText, Enum<?>[] values,
            SelectionListener listener) {
        LabeledCombo combo = new LabeledCombo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
        combo.setLabel(labelText);
        for (Enum<?> value : values)
            combo.add(value.toString());
        combo.select(0);
        if (listener != null)
            combo.addSelectionListener(listener);
        return combo;
    }

    public static Combo createGridCombo(Composite parent, int horizontalSpan, int widthHint, boolean readOnly,
            SelectionListener selectionListener, ModifyListener modifyListener, int style) {
        style = (readOnly ? SWT.READ_ONLY : SWT.NONE) | style;

        final Combo combo = new Combo(parent, style);

        GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false);

        if (horizontalSpan > 0) {
            data.horizontalSpan = horizontalSpan;
        }

        if (widthHint > 0) {
            data.widthHint = widthHint;
        }

        combo.setLayoutData(data);

        if (selectionListener != null) {
            combo.addSelectionListener(selectionListener);
        }

        if (modifyListener != null) {
            combo.addModifyListener(modifyListener);
        }

        if (readOnly) {
            ReadOnlyComboSelectionListener readOnlyListener = new ReadOnlyComboSelectionListener();
            combo.addSelectionListener(readOnlyListener);
            combo.addModifyListener(readOnlyListener);
        }

        return combo;
    }

    public static Combo createGridCombo(Composite parent, int horizontalSpan, int widthHint,
            SelectionListener selectionListener, ModifyListener modifyListener, int style) {
        return createGridCombo(parent, horizontalSpan, widthHint, false, selectionListener, modifyListener, style);
    }

    public static Combo createGridEnumCombo(Composite parent, int horizontalSpan, int widthHint, Enum<?>[] values,
            boolean readOnly, SelectionListener selectionListener, ModifyListener modifyListener, int style) {
        Combo combo = UiUtils.createGridCombo(parent, horizontalSpan, widthHint, readOnly, selectionListener,
                modifyListener, style);
        for (Enum<?> value : values)
            combo.add(value.toString());
        combo.select(0);

        return combo;
    }

    public static Combo createGridEnumCombo(Composite parent, int horizontalSpan, int widthHint, Enum<?>[] values,
            SelectionListener selectionListener, ModifyListener modifyListener, int style) {
        Combo combo = UiUtils.createGridCombo(parent, horizontalSpan, widthHint, false, selectionListener,
                modifyListener, style);
        for (Enum<?> value : values)
            combo.add(value.toString());
        combo.select(0);

        return combo;
    }

    public static Label createGridLabel(Composite parent, String string, int horizontalSpan, int widthHint,
            int style) {
        Label lbl = new Label(parent, style);
        GridData data = new GridData(SWT.FILL, SWT.CENTER, false, false);

        if (widthHint > 0) {
            data.widthHint = widthHint;
        }

        if (horizontalSpan > 1) {
            data.horizontalSpan = horizontalSpan;
        }

        lbl.setLayoutData(data);
        lbl.setText(string);

        return lbl;
    }

    public static Text createGridLabeledText(Composite parent, String label, int labelCols, int textCols,
            boolean readOnly, int style, ModifyListener listener) {
        if (labelCols < 1 || textCols < 1)
            throw new IllegalArgumentException();

        final Label lbl = new Label(parent, SWT.NONE);
        lbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, labelCols, 1));
        lbl.setText(label);

        Text text = new Text(parent, (readOnly ? SWT.READ_ONLY : SWT.NONE) | SWT.BORDER | style | style) {
            @Override
            public void setEnabled(boolean flag) {
                lbl.setEnabled(flag);
                super.setEnabled(flag);
            }

            @Override
            protected void checkSubclass() {
            }
        };
        text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, textCols, 1));
        if (listener != null)
            text.addModifyListener(listener);
        return text;
    }

    public static Text createGridText(Composite parent, int horizontalSpan, int widthHint, boolean readOnly,
            int style) {
        Text text = createNoBorderGridText(parent, horizontalSpan, widthHint,
                (readOnly ? SWT.READ_ONLY : SWT.NONE) | SWT.BORDER | style, null);

        if (readOnly)
            text.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));

        return text;
    }

    public static Text createGridText(Composite parent, int horizontalSpan, int widthHint, boolean readOnly,
            int style, ModifyListener listener) {
        Text text = createNoBorderGridText(parent, horizontalSpan, widthHint,
                (readOnly ? SWT.READ_ONLY : SWT.NONE) | SWT.BORDER | style, listener);

        if (readOnly)
            text.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));

        return text;
    }

    public static Text createGridText(Composite parent, int horizontalSpan, int widthHint, int style) {
        return createNoBorderGridText(parent, horizontalSpan, widthHint, SWT.BORDER | style, null);
    }

    public static Text createGridText(Composite parent, int horizontalSpan, int widthHint, int style,
            ModifyListener listener) {
        return createNoBorderGridText(parent, horizontalSpan, widthHint, SWT.BORDER | style, listener);
    }

    public static Text createLabeledText(Composite parent, String label, boolean readOnly, int style) {
        return createGridLabeledText(parent, label, 1, 1, readOnly, style, null);
    }

    public static Text createLabeledText(Composite parent, String label, boolean readOnly, int style,
            ModifyListener listener) {
        return createGridLabeledText(parent, label, 1, 1, readOnly, style, listener);
    }

    public static ListViewer createListViewer(Composite c, String[] lines, Font font, int maxHeightHintInLines,
            int maxWidthInChars) {
        ListViewer lv = new ListViewer(c, SWT.V_SCROLL | SWT.BORDER | SWT.H_SCROLL);
        org.eclipse.swt.widgets.List l = lv.getList();
        l.setFont(font);
        int maxWidthSeen = 0;
        for (String s : lines) {
            if (s.length() > maxWidthSeen)
                maxWidthSeen = s.length();
            l.add(s);
        }
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = l.getItemHeight()
                * (lines.length < maxHeightHintInLines ? lines.length : maxHeightHintInLines);
        GC gc = new GC(l);
        // gc.setFont(l.getFont());
        int avgCharWidth = gc.getFontMetrics().getAverageCharWidth();
        gc.dispose();
        gd.widthHint = avgCharWidth * (maxWidthSeen < maxWidthInChars ? maxWidthSeen : maxWidthInChars);
        l.setLayoutData(gd);
        return lv;
    }

    public static Text createNoBorderGridText(Composite parent, int horizontalSpan, int widthHint, int style,
            ModifyListener listener) {
        Text text = new Text(parent, style);
        GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false);

        if (horizontalSpan > 0) {
            data.horizontalSpan = horizontalSpan;
        }

        if (widthHint > 0) {
            data.widthHint = widthHint;
        }

        text.setLayoutData(data);
        if (listener != null)
            text.addModifyListener(listener);

        return text;
    }

    public static Button createPushButton(Composite parent, String key, SelectionListener listener) {
        Button button = new Button(parent, SWT.PUSH);
        if (key != null)
            button.setText(JFaceResources.getString(key));
        button.setFont(parent.getFont());
        if (listener != null)
            button.addSelectionListener(listener);
        return button;
    }

    public static Object nvl(Object arg0, Object arg1) {
        return arg0 != null ? arg0 : arg1;
    }

    public static void openError(Shell shell, String title, Throwable t) {
        CoreException c = BuckminsterException.wrap(t);
        ErrorDialog.openError(shell, title, null, c.getStatus());
    }

    public static void setChildrenVisible(Composite composite, boolean visible) {
        for (Control c : composite.getChildren())
            c.setVisible(visible);
    }

    public static void setEnabledRecursively(Control c, boolean enabled) {
        c.setEnabled(enabled);
        if (c instanceof Composite)
            for (Control child : ((Composite) c).getChildren())
                setEnabledRecursively(child, enabled);
    }

    public static void setExpandedRecursively(Object treeOrTreeItem, boolean expand) {
        TreeItem[] tia;
        if (treeOrTreeItem instanceof Tree)
            tia = ((Tree) treeOrTreeItem).getItems();
        else
            tia = new TreeItem[] { (TreeItem) treeOrTreeItem };

        for (TreeItem ti : tia) {
            ti.setExpanded(expand);
            for (TreeItem child : ti.getItems())
                setExpandedRecursively(child, expand);
        }
    }

    public static String trimmedValue(String string) {
        String value = null;

        if (string != null) {
            value = string.trim();
            if (value.length() == 0)
                value = null;
        }
        return value;
    }

    public static String trimmedValue(Text text) {
        String value = null;
        if (text != null) {
            value = text.getText().trim();
            if (value.length() == 0)
                value = null;
        }
        return value;
    }
}