| /******************************************************************************* |
| * Copyright (c) 2000, 2007 IBM Corporation and others. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.ui.util; |
| |
| import org.eclipse.dltk.ui.util.PixelConverter; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.resource.JFaceResources; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.dnd.DragSource; |
| import org.eclipse.swt.dnd.DropTarget; |
| import org.eclipse.swt.graphics.Font; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Caret; |
| 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.Group; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.ScrollBar; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.swt.widgets.Widget; |
| import org.eclipse.ui.forms.widgets.ExpandableComposite; |
| |
| /** |
| * Utility class to simplify access to some SWT resources. |
| */ |
| public class SWTUtil { |
| |
| /** |
| * The default visible item count for {@link Combo}s. Workaround for |
| * https://bugs.eclipse.org/bugs/show_bug.cgi?id=245569 . |
| * |
| * @see Combo#setVisibleItemCount(int) |
| */ |
| public static final int COMBO_VISIBLE_ITEM_COUNT = 20; |
| |
| /** |
| * Returns the standard display to be used. The method first checks, if the |
| * thread calling this method has an associated disaply. If so, this display |
| * is returned. Otherwise the method returns the default display. |
| */ |
| public static Display getStandardDisplay() { |
| Display display; |
| display = Display.getCurrent(); |
| if (display == null) |
| display = Display.getDefault(); |
| return display; |
| } |
| |
| /** |
| * Returns the shell for the given widget. If the widget doesn't represent a |
| * SWT object that manage a shell, <code>null</code> is returned. |
| * |
| * @return the shell for the given widget |
| */ |
| public static Shell getShell(Widget widget) { |
| if (widget instanceof Control) |
| return ((Control) widget).getShell(); |
| if (widget instanceof Caret) |
| return ((Caret) widget).getParent().getShell(); |
| if (widget instanceof DragSource) |
| return ((DragSource) widget).getControl().getShell(); |
| if (widget instanceof DropTarget) |
| return ((DropTarget) widget).getControl().getShell(); |
| if (widget instanceof Menu) |
| return ((Menu) widget).getParent().getShell(); |
| if (widget instanceof ScrollBar) |
| return ((ScrollBar) widget).getParent().getShell(); |
| |
| return null; |
| } |
| |
| public static int getTableHeightHint(Table table, int rows) { |
| if (table.getFont().equals(JFaceResources.getDefaultFont())) |
| table.setFont(JFaceResources.getDialogFont()); |
| int result = table.getItemHeight() * rows + table.getHeaderHeight(); |
| if (table.getLinesVisible()) |
| result += table.getGridLineWidth() * (rows - 1); |
| return result; |
| } |
| |
| /** |
| * Returns a width hint for a button control. |
| */ |
| public static int getButtonWidthHint(Button button) { |
| button.setFont(JFaceResources.getDialogFont()); |
| PixelConverter converter = new PixelConverter(button); |
| int widthHint = converter |
| .convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); |
| return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, |
| true).x); |
| } |
| |
| /** |
| * Sets width and height hint for the button control. <b>Note:</b> This is a |
| * NOP if the button's layout data is not an instance of |
| * <code>GridData</code>. |
| * |
| * @param the |
| * button for which to set the dimension hint |
| */ |
| public static void setButtonDimensionHint(Button button) { |
| Object gd = button.getLayoutData(); |
| if (gd instanceof GridData) { |
| ((GridData) gd).widthHint = getButtonWidthHint(button); |
| ((GridData) gd).horizontalAlignment = GridData.FILL; |
| } |
| } |
| |
| /** |
| * Creates and returns a new push button with the given label and/or image. |
| * |
| * @param parent |
| * parent control |
| * @param label |
| * button label or <code>null</code> |
| * @param image |
| * image of <code>null</code> |
| * |
| * @return a new push button |
| */ |
| public static Button createPushButton(Composite parent, String label, |
| Image image) { |
| Button button = new Button(parent, SWT.PUSH); |
| button.setFont(parent.getFont()); |
| if (image != null) { |
| button.setImage(image); |
| } |
| if (label != null) { |
| button.setText(label); |
| } |
| GridData gd = new GridData(); |
| button.setLayoutData(gd); |
| SWTUtil.setButtonDimensionHint(button); |
| return button; |
| } |
| |
| /** |
| * Creates and returns a new push button with the given label, tooltip |
| * and/or image. |
| * |
| * @param parent |
| * parent control |
| * @param label |
| * button label or <code>null</code> |
| * @param tooltip |
| * the tooltip text for the button or <code>null</code> |
| * @param image |
| * image of <code>null</code> |
| * |
| * @return a new push button |
| */ |
| public static Button createPushButton(Composite parent, String label, |
| String tooltip, Image image) { |
| Button button = createPushButton(parent, label, image); |
| button.setToolTipText(tooltip); |
| return button; |
| } |
| |
| /** |
| * Creates and returns a new radio button with the given label. |
| * |
| * @param parent |
| * parent control |
| * @param label |
| * button label or <code>null</code> |
| * |
| * @return a new radio button |
| */ |
| public static Button createRadioButton(Composite parent, String label) { |
| Button button = new Button(parent, SWT.RADIO); |
| button.setFont(parent.getFont()); |
| if (label != null) { |
| button.setText(label); |
| } |
| GridData gd = new GridData(); |
| button.setLayoutData(gd); |
| SWTUtil.setButtonDimensionHint(button); |
| return button; |
| } |
| |
| /** |
| * Creates and returns a new radio button with the given label. |
| * |
| * @param parent |
| * parent control |
| * @param label |
| * button label or <code>null</code> |
| * @param hspan |
| * the number of columns to span ni the parent composite |
| * |
| * @return a new radio button |
| */ |
| public static Button createRadioButton(Composite parent, String label, |
| int hspan) { |
| Button button = new Button(parent, SWT.RADIO); |
| button.setFont(parent.getFont()); |
| if (label != null) { |
| button.setText(label); |
| } |
| GridData gd = new GridData(GridData.BEGINNING); |
| gd.horizontalSpan = hspan; |
| button.setLayoutData(gd); |
| SWTUtil.setButtonDimensionHint(button); |
| return button; |
| } |
| |
| /** |
| * Creates a checked button |
| * |
| * @param parent |
| * the parent composite to add this button to |
| * @param label |
| * the label for the button |
| * @param checked |
| * the button's checked state |
| * @return a new check button |
| */ |
| public static Button createCheckButton(Composite parent, String label, |
| boolean checked) { |
| Button button = new Button(parent, SWT.CHECK); |
| button.setFont(parent.getFont()); |
| if (label != null) { |
| button.setText(label); |
| } |
| GridData gd = new GridData(); |
| button.setLayoutData(gd); |
| button.setSelection(checked); |
| return button; |
| } |
| |
| /** |
| * Creates a checked button |
| * |
| * @param parent |
| * the parent composite to add this button to |
| * @param label |
| * the label for the button |
| * @param checked |
| * the button's checked state |
| * @param hspan |
| * the horizontal span to take up in the parent composite |
| * @return a new check button |
| */ |
| public static Button createCheckButton(Composite parent, String label, |
| boolean checked, int hspan) { |
| Button button = new Button(parent, SWT.CHECK); |
| button.setFont(parent.getFont()); |
| if (label != null) { |
| button.setText(label); |
| } |
| GridData gd = new GridData(); |
| gd.horizontalSpan = hspan; |
| button.setLayoutData(gd); |
| button.setSelection(checked); |
| return button; |
| } |
| |
| /** |
| * Creates a new label widget |
| * |
| * @param parent |
| * the parent composite to add this label widget to |
| * @param text |
| * the text for the label |
| * @param hspan |
| * the horizontal span to take up in the parent composite |
| * @return the new label |
| */ |
| public static Label createLabel(Composite parent, String text, Font font, |
| int hspan) { |
| Label l = new Label(parent, SWT.NONE); |
| l.setFont(font); |
| l.setText(text); |
| GridData gd = new GridData(); |
| gd.horizontalSpan = hspan; |
| l.setLayoutData(gd); |
| return l; |
| } |
| |
| /** |
| * Creates a new label widget |
| * |
| * @param parent |
| * the parent composite to add this label widget to |
| * @param text |
| * the text for the label |
| * @param hspan |
| * the horizontal span to take up in the parent composite |
| * @return the new label |
| */ |
| public static Label createLabel(Composite parent, String text, int hspan) { |
| Label l = new Label(parent, SWT.NONE); |
| l.setFont(parent.getFont()); |
| l.setText(text); |
| GridData gd = new GridData(); |
| gd.horizontalSpan = hspan; |
| l.setLayoutData(gd); |
| return l; |
| } |
| |
| /** |
| * Creates a wrapping label |
| * |
| * @param parent |
| * the parent composite to add this label to |
| * @param text |
| * the text to be displayed in the label |
| * @param hspan |
| * the horozontal span that label should take up in the parent |
| * composite |
| * @param wrapwidth |
| * the width hint that the label should wrap at |
| * @return a new label that wraps at a specified width |
| */ |
| public static Label createWrapLabel(Composite parent, String text, |
| int hspan, int wrapwidth) { |
| Label l = new Label(parent, SWT.WRAP); |
| l.setFont(parent.getFont()); |
| l.setText(text); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = hspan; |
| gd.widthHint = wrapwidth; |
| l.setLayoutData(gd); |
| return l; |
| } |
| |
| /** |
| * Creates a new text widget |
| * |
| * @param parent |
| * the parent composite to add this text widget to |
| * @param hspan |
| * the horizontal span to take up on the parent composite |
| * @return the new text widget |
| */ |
| public static Text createSingleText(Composite parent, int hspan) { |
| Text t = new Text(parent, SWT.SINGLE | SWT.BORDER); |
| t.setFont(parent.getFont()); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = hspan; |
| t.setLayoutData(gd); |
| return t; |
| } |
| |
| /** |
| * Creates a new text widget |
| * |
| * @param parent |
| * the parent composite to add this text widget to |
| * @param style |
| * the style bits for the text widget |
| * @param hspan |
| * the horizontal span to take up on the parent composite |
| * @return the new text widget |
| */ |
| public static Text createText(Composite parent, int style, int hspan, |
| String text) { |
| Text t = new Text(parent, style); |
| t.setFont(parent.getFont()); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = hspan; |
| t.setLayoutData(gd); |
| t.setText(text); |
| return t; |
| } |
| |
| /** |
| * Creates a Group widget |
| * |
| * @param parent |
| * the parent composite to add this group to |
| * @param text |
| * the text for the heading of the group |
| * @param columns |
| * the number of columns within the group |
| * @param hspan |
| * the horizontal span the group should take up on the parent |
| * @param fill |
| * the style for how this composite should fill into its parent |
| * Can be one of <code>GridData.FILL_HORIZONAL</code>, |
| * <code>GridData.FILL_BOTH</code> or |
| * <code>GridData.FILL_VERTICAL</code> |
| * @return the new group |
| */ |
| public static Group createGroup(Composite parent, String text, int columns, |
| int hspan, int fill) { |
| Group g = new Group(parent, SWT.NONE); |
| g.setLayout(new GridLayout(columns, false)); |
| g.setText(text); |
| g.setFont(parent.getFont()); |
| GridData gd = new GridData(fill); |
| gd.horizontalSpan = hspan; |
| g.setLayoutData(gd); |
| return g; |
| } |
| |
| /** |
| * Creates a Composite widget |
| * |
| * @param parent |
| * the parent composite to add this composite to |
| * @param columns |
| * the number of columns within the composite |
| * @param hspan |
| * the horizontal span the composite should take up on the parent |
| * @param fill |
| * the style for how this composite should fill into its parent |
| * Can be one of <code>GridData.FILL_HORIZONAL</code>, |
| * <code>GridData.FILL_BOTH</code> or |
| * <code>GridData.FILL_VERTICAL</code> |
| * @return the new group |
| */ |
| public static Composite createComposite(Composite parent, Font font, |
| int columns, int hspan, int fill) { |
| Composite g = new Composite(parent, SWT.NONE); |
| g.setLayout(new GridLayout(columns, false)); |
| g.setFont(font); |
| GridData gd = new GridData(fill); |
| gd.horizontalSpan = hspan; |
| g.setLayoutData(gd); |
| return g; |
| } |
| |
| /** |
| * Creates a Composite widget |
| * |
| * @param parent |
| * the parent composite to add this composite to |
| * @param columns |
| * the number of columns within the composite |
| * @param hspan |
| * the horizontal span the composite should take up on the parent |
| * @param fill |
| * the style for how this composite should fill into its parent |
| * Can be one of <code>GridData.FILL_HORIZONAL</code>, |
| * <code>GridData.FILL_BOTH</code> or |
| * <code>GridData.FILL_VERTICAL</code> |
| * @param marginwidth |
| * the width of the margin to place around the composite (default |
| * is 5, specified by GridLayout) |
| * @return the new group |
| */ |
| public static Composite createComposite(Composite parent, Font font, |
| int columns, int hspan, int fill, int marginwidth, int marginheight) { |
| Composite g = new Composite(parent, SWT.NONE); |
| GridLayout layout = new GridLayout(columns, false); |
| layout.marginWidth = marginwidth; |
| layout.marginHeight = marginheight; |
| g.setLayout(layout); |
| g.setFont(font); |
| GridData gd = new GridData(fill); |
| gd.horizontalSpan = hspan; |
| g.setLayoutData(gd); |
| return g; |
| } |
| |
| /** |
| * creates a vertical spacer for seperating components |
| * |
| * @param comp |
| * @param numlines |
| */ |
| public static void createVerticalSpacer(Composite comp, int numlines) { |
| Label lbl = new Label(comp, SWT.NONE); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.heightHint = numlines; |
| lbl.setLayoutData(gd); |
| } |
| |
| /** |
| * creates a horizontal spacer for seperating components |
| * |
| * @param comp |
| * @param numlines |
| */ |
| public static void createHorizontalSpacer(Composite comp, int numlines) { |
| Label lbl = new Label(comp, SWT.NONE); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = numlines; |
| lbl.setLayoutData(gd); |
| } |
| |
| /** |
| * This method is used to make a combo box |
| * |
| * @param parent |
| * the parent composite to add the new combo to |
| * @param style |
| * the style for the Combo |
| * @param hspan |
| * the horizontal span to take up on the parent composite |
| * @param fill |
| * how the combo will fill into the composite Can be one of |
| * <code>GridData.FILL_HORIZONAL</code>, |
| * <code>GridData.FILL_BOTH</code> or |
| * <code>GridData.FILL_VERTICAL</code> |
| * @param items |
| * the item to put into the combo |
| * @return a new Combo instance |
| */ |
| public static Combo createCombo(Composite parent, int style, int hspan, |
| int fill, String[] items) { |
| Combo c = new Combo(parent, style); |
| c.setFont(parent.getFont()); |
| GridData gd = new GridData(fill); |
| gd.horizontalSpan = hspan; |
| c.setLayoutData(gd); |
| c.setItems(items); |
| c.select(0); |
| return c; |
| } |
| |
| /** |
| * This method is used to make a combo box with a default fill style of |
| * GridData.FILL_HORIZONTAL |
| * |
| * @param parent |
| * the parent composite to add the new combo to |
| * @param style |
| * the style for the Combo |
| * @param hspan |
| * the horizontal span to take up on the parent composite |
| * @param items |
| * the item to put into the combo |
| * @return a new Combo instance |
| */ |
| public static Combo createCombo(Composite parent, int style, int hspan, |
| String[] items) { |
| Combo c = new Combo(parent, style); |
| c.setFont(parent.getFont()); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = hspan; |
| c.setLayoutData(gd); |
| c.setItems(items); |
| c.select(0); |
| return c; |
| } |
| |
| /** |
| * Creates an ExpandibleComposite widget |
| * |
| * @param parent |
| * the parent to add this widget to |
| * @param style |
| * the style for ExpandibleComposite expanding handle, and layout |
| * @param label |
| * the label for the widget |
| * @param hspan |
| * how many columns to span in the parent |
| * @param fill |
| * the fill style for the widget Can be one of |
| * <code>GridData.FILL_HORIZONAL</code>, |
| * <code>GridData.FILL_BOTH</code> or |
| * <code>GridData.FILL_VERTICAL</code> |
| * @return a new ExpandibleComposite widget |
| */ |
| public static ExpandableComposite createExpandibleComposite( |
| Composite parent, int style, String label, int hspan, int fill) { |
| ExpandableComposite ex = new ExpandableComposite(parent, SWT.NONE, |
| style); |
| ex.setText(label); |
| ex.setFont(JFaceResources.getFontRegistry().getBold( |
| JFaceResources.DIALOG_FONT)); |
| GridData gd = new GridData(fill); |
| gd.horizontalSpan = hspan; |
| ex.setLayoutData(gd); |
| return ex; |
| } |
| |
| /** |
| * Sets the default visible item count for {@link Combo}s. Workaround for |
| * https://bugs.eclipse.org/bugs/show_bug.cgi?id=7845 . |
| * |
| * @param combo |
| * the combo |
| * |
| * @see Combo#setVisibleItemCount(int) |
| * @see #COMBO_VISIBLE_ITEM_COUNT |
| */ |
| public static void setDefaultVisibleItemCount(Combo combo) { |
| combo.setVisibleItemCount(COMBO_VISIBLE_ITEM_COUNT); |
| } |
| } |