| /******************************************************************************* |
| * Copyright (c) 2014, 2016 Willink Transformations 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: |
| * R.Dvorak and others - QVTo debugger framework |
| * E.D.Willink - revised API for OCL debugger framework |
| *******************************************************************************/ |
| package org.eclipse.ocl.examples.debug.vm.ui.pages; |
| |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.DialogPage; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.resource.JFaceResources; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Font; |
| import org.eclipse.swt.graphics.FontMetrics; |
| import org.eclipse.swt.graphics.GC; |
| 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.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Group; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Text; |
| |
| /** |
| * Based on the SWTFactory from JDT. |
| */ |
| public class SWTFactory { |
| /** |
| * 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 |
| * @param text |
| * the initial text, not <code>null</code> |
| * @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(String.valueOf(text)); |
| return t; |
| } |
| |
| /** |
| * 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) |
| * @param marginheight |
| * the height 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 check box button using the parents' font |
| * |
| * @param parent |
| * the parent to add the button to |
| * @param label |
| * the label for the button |
| * @param image |
| * the image for the button |
| * @param checked |
| * the initial checked state of the button |
| * @param hspan |
| * the horizontal span to take up in the parent composite |
| * @return a new checked button set to the initial checked state |
| */ |
| public static Button createCheckButton(Composite parent, String label, |
| Image image, boolean checked, int hspan) { |
| Button button = new Button(parent, SWT.CHECK); |
| button.setFont(parent.getFont()); |
| button.setSelection(checked); |
| if (image != null) { |
| button.setImage(image); |
| } |
| if (label != null) { |
| button.setText(label); |
| } |
| GridData gd = new GridData(); |
| gd.horizontalSpan = hspan; |
| button.setLayoutData(gd); |
| SWTFactory.setButtonDimensionHint(button); |
| 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, 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 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 in 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); |
| SWTFactory.setButtonDimensionHint(button); |
| return button; |
| } |
| |
| /** |
| * 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; |
| } |
| |
| /** |
| * 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 button |
| * 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; |
| } |
| } |
| |
| /** |
| * 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); |
| } |
| |
| private static class PixelConverter { |
| |
| private FontMetrics fFontMetrics; |
| |
| public PixelConverter(Control control) { |
| GC gc = new GC(control); |
| gc.setFont(control.getFont()); |
| fFontMetrics = gc.getFontMetrics(); |
| gc.dispose(); |
| } |
| |
| /** |
| * @see DialogPage#convertHorizontalDLUsToPixels |
| */ |
| public int convertHorizontalDLUsToPixels(int dlus) { |
| return Dialog.convertHorizontalDLUsToPixels(fFontMetrics, dlus); |
| } |
| |
| /** |
| * @see DialogPage#convertWidthInCharsToPixels |
| * |
| public int convertWidthInCharsToPixels(int chars) { |
| return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars); |
| } */ |
| } |
| } |