blob: 835e6fbbea04f9a6923e1c9f73d21e276e59d66d [file] [log] [blame]
/*******************************************************************************
* 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);
} */
}
}