/******************************************************************************* * Copyright (c) 2014 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(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); } */ } }