blob: 7a0e3bbd770f073fc3b1f92aea08fe555916c4f4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2014 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.utils.ui.controls;
import java.util.StringTokenizer;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
/**
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
*/
public class ControlFactory {
public static Control setParentColors(Control control) {
Composite parent = control.getParent();
control.setBackground(parent.getBackground());
control.setForeground(parent.getForeground());
return control;
}
/**
* Creates composite control and sets the default layout data.
*
* @param parent the parent of the new composite
* @param numColumns the number of columns for the new composite
* @return the newly-created composite
*/
public static Composite createComposite(Composite parent, int numColumns) {
return createCompositeEx(parent, numColumns, GridData.FILL_HORIZONTAL);
}
/**
* Creates composite control and sets the specified layout data.
*
* @param parent the parent of the new composite
* @param numColumns the number of columns for the new composite
* @param layoutMode - GridData modes that should be applied to this control
* @return the newly-created composite
*/
public static Composite createCompositeEx(Composite parent, int numColumns, int layoutMode) {
Composite composite = new Composite(parent, SWT.NULL);
composite.setFont(parent.getFont());
composite.setLayout(new GridLayout(numColumns, true));
composite.setLayoutData(new GridData(layoutMode));
return composite;
}
/**
* Creates thick separator.
*
* @param parent the parent of the new composite
* @param color the separator color
* @return preferedThickness - the preferred thickness of separator (or 2 if SWT.DEFAULT)
*/
public static Composite createCompositeSeparator(Composite parent, Color color, int preferedHeight) {
Composite separator = createComposite(parent, 1);
GridData gd = (GridData) separator.getLayoutData();
gd.heightHint = ((SWT.DEFAULT == preferedHeight) ? 2 : preferedHeight);
separator.setLayoutData(gd);
separator.setBackground(color);
return separator;
}
/**
* Creates a composite with a highlighted Note entry and a message text.
* This is designed to take up the full width of the page.
*
* @param font the font to use
* @param composite the parent composite
* @param title the title of the note
* @param message the message for the note
* @return the composite for the note
*/
public static Composite createNoteComposite(Font font, Composite composite, String title, String message) {
Composite messageComposite = new Composite(composite, SWT.NONE);
GridLayout messageLayout = new GridLayout();
messageLayout.numColumns = 2;
messageLayout.marginWidth = 0;
messageLayout.marginHeight = 0;
messageComposite.setLayout(messageLayout);
messageComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
messageComposite.setFont(font);
final Label noteLabel = new Label(messageComposite, SWT.BOLD);
noteLabel.setText(title);
noteLabel.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
noteLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
final IPropertyChangeListener fontListener = new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (JFaceResources.BANNER_FONT.equals(event.getProperty())) {
noteLabel.setFont(JFaceResources.getFont(JFaceResources.BANNER_FONT));
}
}
};
JFaceResources.getFontRegistry().addListener(fontListener);
noteLabel.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent event) {
JFaceResources.getFontRegistry().removeListener(fontListener);
}
});
Label messageLabel = new Label(messageComposite, SWT.WRAP);
messageLabel.setText(message);
messageLabel.setFont(font);
return messageComposite;
}
/**
* Creates a separator.
*
* @param parent the parent of the new composite
* @param nCols number of columns to span
* @return a separator label
*/
public static Label createSeparator(Composite parent, int nCols) {
Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = nCols;
separator.setLayoutData(data);
return separator;
}
/**
* Creates a spacer control.
*
* @param parent The parent composite
*/
public static Control createEmptySpace(Composite parent) {
return createEmptySpace(parent, 1);
}
/**
* Creates a spacer control with the given span.
* The composite is assumed to have {@link GridLayout} as layout.
*
* @param parent The parent composite
*/
public static Control createEmptySpace(Composite parent, int span) {
Label label = new Label(parent, SWT.LEFT);
GridData gd = new GridData();
gd.horizontalAlignment = GridData.BEGINNING;
gd.grabExcessHorizontalSpace = false;
gd.horizontalSpan = span;
gd.horizontalIndent = 0;
gd.widthHint = 0;
gd.heightHint = 0;
label.setLayoutData(gd);
return label;
}
/**
* Creates an new label (basic method)
*
* @param parent parent object
* @param text the label text
* @param widthHint - recommended widget width
* @param heightHint - recommended widget height
* @param style - control style
* @return the new label
*/
public static Label createLabel(Composite parent, String text, int widthHint, int heightHint, int style) {
Label label = new Label(parent, style);
label.setFont(parent.getFont());
label.setText(text);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 1;
gd.widthHint = widthHint;
gd.heightHint = heightHint;
label.setLayoutData(gd);
return label;
}
/**
* Utility method that creates a label instance
* and sets the default layout data.
*
* @param parent the parent for the new label
* @param text the text for the new label
* @return the new label
*/
public static Label createLabel(Composite parent, String text) {
return createLabel(parent, text, SWT.DEFAULT, SWT.DEFAULT, SWT.LEFT);
}
/**
* Utility method that creates a label instance
* and sets the default layout data and sets the
* font attributes to be SWT.BOLD.
*
* @param parent the parent for the new label
* @param text the text for the new label
* @return the new label
*/
public static Label createBoldLabel(Composite parent, String text) {
Label label = createLabel(parent, text);
FontData[] fd = label.getFont().getFontData();
fd[0].setStyle(SWT.BOLD);
Font font = new Font(Display.getCurrent(), fd[0]);
label.setFont(font);
return label;
}
/**
* Creates an new Wrapped label
*
*
* @param parent parent object
* @param text the label text
* @param widthHint - recommended widget width
* @param heightHint - recommended widget height
* @return the new label
*/
public static Label createWrappedLabel(Composite parent, String text, int widthHint, int heightHint) {
return createLabel(parent, text, widthHint, heightHint, SWT.LEFT | SWT.WRAP);
}
/**
* Creates an new checkbox instance and sets the default
* layout data.
*
* @param group the composite in which to create the checkbox
* @param label the string to set into the checkbox
* @return the new checkbox
*/
public static Button createCheckBox(Composite group, String label) {
Button button = new Button(group, SWT.CHECK | SWT.LEFT);
button.setFont(group.getFont());
button.setText(label);
GridData data = new GridData();
button.setLayoutData(data);
button.setForeground(group.getForeground());
return button;
}
/**
* Creates an new checkbox instance and sets the default
* layout data.
*
* @param group the composite in which to create the checkbox
* @param label the string to set into the checkbox
* @return the new checkbox
*/
public static Button createCheckBoxEx(Composite group, String label, int style) {
Button button = new Button(group, SWT.CHECK | style);
button.setFont(group.getFont());
button.setText(label);
GridData data = new GridData();
button.setLayoutData(data);
button.setForeground(group.getForeground());
return button;
}
/**
* Creates an new radiobutton instance and sets the default
* layout data.
*
* @param group the composite in which to create the radiobutton
* @param label the string to set into the radiobutton
* @param value the string to identify radiobutton
* @return the new checkbox
*/
public static Button createRadioButton(Composite group, String label, String value, SelectionListener listener) {
Button button = new Button(group, SWT.RADIO | SWT.LEFT);
button.setFont(group.getFont());
button.setText(label);
button.setData((null == value) ? label : value);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.BEGINNING;
button.setLayoutData(data);
if (null != listener)
button.addSelectionListener(listener);
return button;
}
/**
* Utility method that creates a push button instance
* and sets the default layout data.
*
* @param parent the parent for the new button
* @param label the label for the new button
* @return the newly-created button
*/
public static Button createPushButton(Composite parent, String label) {
Button button = new Button(parent, SWT.PUSH);
button.setFont(parent.getFont());
button.setText(label);
// button.addSelectionListener(this);
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
button.setLayoutData(data);
return button;
}
/**
* Create a text field specific for this application
*
* @param parent the parent of the new text field
* @return the new text field
*/
public static Text createTextField(Composite parent) {
return createTextField(parent, SWT.SINGLE | SWT.BORDER);
}
public static Text createTextField(Composite parent, int style) {
Text text = new Text(parent, style);
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
data.verticalAlignment = GridData.CENTER;
data.grabExcessVerticalSpace = false;
text.setLayoutData(data);
return text;
}
/**
* Create a group box
*
* @param parent the parent of the new control
* @param label the group box label
* @param nColumns - number of layout columns
* @return the new group box
*/
public static Group createGroup(Composite parent, String label, int nColumns) {
Group group = new Group(parent, SWT.NONE);
group.setFont(parent.getFont());
group.setText(label);
GridLayout layout = new GridLayout();
layout.numColumns = nColumns;
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
return group;
}
/**
* Create a List box
*
* @param parent the parent of the new control
* @param strdata the data for the list, separated by commas
* @param selData - the item that shall be selected
* @return the new list box
*/
public static List createList(Composite parent, String strdata, String selData) {
List list = new List(parent, SWT.SINGLE);
list.setFont(parent.getFont());
GridData data = new GridData();
list.setLayoutData(data);
StringTokenizer st = new StringTokenizer(strdata, ","); //$NON-NLS-1$
while (st.hasMoreTokens())
list.add(st.nextToken());
if (selData == null) {
if (list.getItemCount() > 0)
list.select(0);
} else {
selectList(list, selData);
}
return list;
}
public static void selectList(List list, String selData) {
int n_sel = list.indexOf(selData);
if (0 > n_sel)
n_sel = 0;
list.select(n_sel);
}
/**
* Create this group's list viewer.
*/
public static TableViewer createTableViewer(Composite parent, String[] opt_list, int width, int height, int style) {
TableViewer listViewer = new TableViewer(parent, SWT.BORDER | style);
GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
data.widthHint = width;
data.heightHint = height;
listViewer.getTable().setLayoutData(data);
if (null != opt_list)
listViewer.add(opt_list);
return listViewer;
}
/**
* Create this group's list viewer.
*/
public static TableViewer createTableViewer(Composite parent, int width, int height, int style, String[] columns,
int[] colWidths) {
TableViewer listViewer = createTableViewer(parent, null, width, height, style);
Table table = listViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableLayout tableLayout = new TableLayout();
/*
TableColumn column= table.getColumn(0);
column.setText(columns[0]);
tableLayout.addColumnData(new ColumnWeightData(colWidths[0], false));
*/
TableColumn column;
for (int i = 0; i < columns.length; ++i) {
column = new TableColumn(table, SWT.NULL);
column.setText(columns[i]);
tableLayout.addColumnData(new ColumnWeightData(colWidths[i], true));
}
table.setLayout(tableLayout);
return listViewer;
}
public static void deactivateCellEditor(TableViewer viewer) {
if (null == viewer)
return;
CellEditor[] es = viewer.getCellEditors();
TableItem[] items = viewer.getTable().getSelection();
if (items.length >= 0) {
for (int i = 0; i < es.length; ++i) {
CellEditor e = es[i];
if (e.isActivated()) {
if (e.isValueValid()) {
Object[] properties = viewer.getColumnProperties();
Object value = e.getValue();
viewer.cancelEditing();
viewer.getCellModifier().modify(items[0], (String) properties[i], value);
} else
viewer.cancelEditing();
break;
}
}
}
}
/**
* Create this group's list viewer.
*/
public static CheckboxTableViewer createListViewer(Composite parent, String[] opt_list, int width, int height,
int style) {
Table table = new Table(parent, SWT.BORDER | SWT.CHECK);
table.setFont(parent.getFont());
CheckboxTableViewer listViewer = new CheckboxTableViewer(table);
GridData data = new GridData(style);
data.widthHint = width;
data.heightHint = height;
listViewer.getTable().setLayoutData(data);
if (null != opt_list)
listViewer.add(opt_list);
// listViewer.setLabelProvider(listLabelProvider);
// listViewer.addCheckStateListener(this);
return listViewer;
}
public static CheckboxTableViewer createListViewer(Composite parent, int width, int height, int style,
String[] columns, int[] colWidths) {
CheckboxTableViewer listViewer = createListViewer(parent, null, width, height, style);
Table table = listViewer.getTable();
table.setFont(parent.getFont());
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableLayout tableLayout = new TableLayout();
table.setLayout(tableLayout);
TableColumn column = table.getColumn(0);
column.setText(columns[0]);
tableLayout.addColumnData(new ColumnWeightData(colWidths[0], false));
for (int i = 1; i < columns.length; ++i) {
column = new TableColumn(table, SWT.NULL);
column.setText(columns[i]);
tableLayout.addColumnData(new ColumnWeightData(colWidths[i], false));
}
return listViewer;
}
/**
* Create a selection combo
*
* @param parent the parent of the new text field
* @param strdata of comma separated tokens to fill selection list
* @param selData the item that shall be selected
* @return the new combo
*/
public static CCombo createSelectCCombo(Composite parent, String strdata, String selData) {
return createSelectCCombo(parent, strdata, selData, SWT.READ_ONLY | SWT.BORDER);
}
public static CCombo createSelectCCombo(Composite parent, String strdata, String selData, int style) {
CCombo combo = new CCombo(parent, style);
combo.setFont(parent.getFont());
GridData data = new GridData(GridData.FILL_HORIZONTAL);
combo.setLayoutData(data);
StringTokenizer st = new StringTokenizer(strdata, ","); //$NON-NLS-1$
while (st.hasMoreTokens())
combo.add(st.nextToken());
if (selData == null || selData.length() == 0) {
if (combo.getItemCount() > 0)
combo.select(0);
} else {
selectCCombo(combo, selData);
}
return combo;
}
/**
* Create a selection combo
*
* @param parent the parent of the new text field
* @param strdata array of elements
* @param selData selected element
* @return the new combo
*/
public static CCombo createSelectCCombo(Composite parent, String[] strdata, String selData) {
return createSelectCCombo(parent, strdata, selData, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
}
public static CCombo createSelectCCombo(Composite parent, String[] strdata, String selData, int style) {
CCombo combo = new CCombo(parent, style);
combo.setFont(parent.getFont());
GridData data = new GridData(GridData.FILL_HORIZONTAL);
combo.setLayoutData(data);
for (int i = 0; i < strdata.length; ++i) {
combo.add(strdata[i]);
}
if (selData == null)
combo.select(0);
else
selectCCombo(combo, selData);
return combo;
}
public static void selectCCombo(CCombo combo, String selData) {
int n_sel = combo.indexOf(selData);
if (0 > n_sel)
n_sel = 0;
combo.select(n_sel);
}
/**
* Create a selection combo
*
* @param parent the parent of the new text field
* @param strdata of comma separated tokens to fill selection list
* @param selData the item that shall be selected
* @return the new combo
*/
public static Combo createSelectCombo(Composite parent, String strdata, String selData) {
return createSelectCombo(parent, strdata, selData, SWT.READ_ONLY | SWT.BORDER);
}
public static Combo createSelectCombo(Composite parent, String strdata, String selData, int style) {
Combo combo = new Combo(parent, style);
combo.setFont(parent.getFont());
GridData data = new GridData(GridData.FILL_HORIZONTAL);
combo.setLayoutData(data);
StringTokenizer st = new StringTokenizer(strdata, ","); //$NON-NLS-1$
while (st.hasMoreTokens())
combo.add(st.nextToken());
if (selData == null || selData.length() == 0) {
if (combo.getItemCount() > 0)
combo.select(0);
} else {
selectCombo(combo, selData);
}
return combo;
}
/**
* Create a selection combo
*
* @param parent the parent of the new text field
* @param strdata array of elements
* @param selData selected element
* @return the new combo
*/
public static Combo createSelectCombo(Composite parent, String[] strdata, String selData) {
return createSelectCombo(parent, strdata, selData, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
}
public static Combo createSelectCombo(Composite parent, String[] strdata, String selData, int style) {
Combo combo = new Combo(parent, style);
combo.setFont(parent.getFont());
GridData data = new GridData(GridData.FILL_HORIZONTAL);
combo.setLayoutData(data);
for (int i = 0; i < strdata.length; ++i) {
combo.add(strdata[i]);
}
if (selData == null)
combo.select(0);
else
selectCombo(combo, selData);
return combo;
}
public static void selectCombo(Combo combo, String selData) {
int n_sel = combo.indexOf(selData);
if (0 > n_sel) {
if ((combo.getStyle() & SWT.READ_ONLY) == 0) {
combo.setText(selData);
return;
}
n_sel = 0;
}
combo.select(n_sel);
}
/**
* Create a dialog shell, child to the top level workbench shell.
*
* @return The new Shell usable for a dialog.
*/
public static Shell createDialogShell() {
Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
return new Shell(parent, SWT.DIALOG_TRIM);
}
public static Composite insertSpace(Composite parent, int nSpan, int height) {
Composite space = ControlFactory.createCompositeSeparator(parent, parent.getBackground(),
(SWT.DEFAULT != height ? height : 5));
((GridData) space.getLayoutData()).horizontalSpan = nSpan;
return space;
}
public static MessageBox createDialog(String title, String message, int style) {
MessageBox box = new MessageBox(createDialogShell(), style | SWT.APPLICATION_MODAL);
box.setText(title);
box.setMessage(message);
return box;
}
public static MessageBox createYesNoDialog(String title, String message) {
return createDialog(title, message, SWT.YES | SWT.NO | SWT.ICON_QUESTION);
}
public static MessageBox createOkDialog(String title, String message) {
return createDialog(title, message, SWT.OK | SWT.ICON_INFORMATION);
}
public static MessageBox createOkCancelDialog(String title, String message) {
return createDialog(title, message, SWT.OK | SWT.CANCEL | SWT.ICON_INFORMATION);
}
}