/*************************************************************************************************** * Copyright (c) 2005, 2009 Eteration A.S. and Gorkem Ercan. 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: Gorkem Ercan - initial API and implementation * **************************************************************************************************/ package org.eclipse.jst.server.generic.ui.internal; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.layout.GridData; 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.DirectoryDialog; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.widgets.FormToolkit; /** * SWT Utilities. Used for creating the UI elements for generic server UIs. * * @author Gorkem Ercan */ public class SWTUtil { private static FontMetrics fontMetrics; protected static void initializeDialogUnits(Control testControl) { // Compute and store a font metric GC gc = new GC(testControl); gc.setFont(JFaceResources.getDialogFont()); fontMetrics = gc.getFontMetrics(); gc.dispose(); } /** * Returns a width hint for a button control. */ protected static int getButtonWidthHint(Button button) { int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_WIDTH); return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); } /** * Create a new button with the standard size. * * @param comp * the component to add the button to * @param label * the button label * @return a button */ public static Button createButton(Composite comp, String label) { Button b = new Button(comp, SWT.PUSH); b.setText(label); if (fontMetrics == null) initializeDialogUnits(comp); GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING); data.widthHint = getButtonWidthHint(b); b.setLayoutData(data); return b; } /** * Convert DLUs to pixels. * * @param comp * a component * @param x * pixels * @return dlus */ public static int convertHorizontalDLUsToPixels(Composite comp, int x) { if (fontMetrics == null) initializeDialogUnits(comp); return Dialog.convertHorizontalDLUsToPixels(fontMetrics, x); } /** * Convert DLUs to pixels. * * @param comp * a component * @param y * pixels * @return dlus */ public static int convertVerticalDLUsToPixels(Composite comp, int y) { if (fontMetrics == null) initializeDialogUnits(comp); return Dialog.convertVerticalDLUsToPixels(fontMetrics, y); } /** * Creates a label, text and a button to open a directory dialog. * * @param title * @param value * @param parent * @return Text that holds value * */ public static Text createLabeledPath(String title, String value, final Composite parent) { return SWTUtil.createLabeledPath(title, value, parent, null); } /** * Creates a label, text and a button to open a directory dialog. This * method creates Forum UI compatible widgets. * * @param title * @param value * @param parent * @param toolkit * @return Text that holds value */ public static Text createLabeledPath(String title, String value, final Composite parent, FormToolkit toolkit) { Label label = null; Text cText = null; Button button = null; if (toolkit == null) { label = new Label(parent, SWT.NONE); label.setText(title); cText = new Text(parent, SWT.SHADOW_IN | SWT.BORDER); button = SWTUtil.createButton(parent, GenericServerUIMessages.serverTypeGroup_label_browse); } else { createFormLabel(title, parent, toolkit); cText = toolkit.createText(parent, value); button = toolkit.createButton(parent, GenericServerUIMessages.serverTypeGroup_label_browse, SWT.PUSH); } GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, false); gridData.horizontalSpan = 1; final Text text = cText; text.setLayoutData(gridData); text.setText(value); button.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { DirectoryDialog dlg = new DirectoryDialog(parent.getShell()); dlg.setFilterPath(text.getText().replace('\\', '/')); String res = dlg.open(); if (res != null) { text.setText(res.replace('\\', '/')); } } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); return text; } /** * Creates a label, text and a button thats opens a file dialog * * @param title * @param value * @param parent * @return Text that holds the value */ public static Text createLabeledFile(String title, String value, final Composite parent) { return SWTUtil.createLabeledFile(title, value, parent, null); } /** * Creates a label, text and a button thats opens a file dialog. This method * is used for creating Form UI compatible widgets * * @param title * @param value * @param parent * @param toolkit * @return */ public static Text createLabeledFile(String title, String value, final Composite parent, FormToolkit toolkit) { Label label; Text cText; Button button; if (toolkit == null) { label = new Label(parent, SWT.NONE); label.setText(title); cText = new Text(parent, SWT.SHADOW_IN | SWT.BORDER); button = SWTUtil.createButton(parent, GenericServerUIMessages.serverTypeGroup_label_browse); } else { createFormLabel(title, parent, toolkit); cText = toolkit.createText(parent, value); button = toolkit.createButton(parent, GenericServerUIMessages.serverTypeGroup_label_browse, SWT.PUSH); } final Text text = cText; GridData gridData = new GridData(SWT.FILL,SWT.BEGINNING,true,false); gridData.horizontalSpan = 1; text.setLayoutData(gridData); text.setText(value); button.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { FileDialog dlg = new FileDialog(parent.getShell()); dlg.setFileName(text.getText().replace('\\', '/')); String res = dlg.open(); if (res != null) { text.setText(res.replace('\\', '/')); } } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); return text; } /** * Creates a label and a text * * @param title * @param value * @param parent * @return Text object that holds the value */ public static Text createLabeledText(String title, String value, Composite parent) { return SWTUtil.createLabeledText( title, value, parent, null ); } /** * Creates a label and a text. This method created form ui compatible * widgets * * @param title * @param value * @param parent * @param toolkit * @return Text control that holds the value */ public static Text createLabeledText(String title, String value, Composite parent, FormToolkit toolkit) { Label label; Text text; if (toolkit == null) { label = new Label(parent, SWT.NONE); label.setText(title); text = new Text(parent, SWT.SHADOW_IN | SWT.BORDER); } else { createFormLabel(title, parent, toolkit); text = toolkit.createText(parent, value); } GridData gridData = new GridData(SWT.FILL,SWT.BEGINNING,true,false); gridData.horizontalSpan = 2; text.setLayoutData(gridData); text.setText(value); return text; } /** * Creates a CHECK style button and label * * @param title * @param value * @param parent * @return Check Button */ public static Button createLabeledCheck(String title, boolean value, Composite parent) { return SWTUtil.createLabeledCheck(title, value, parent, null); } /** * Creates a CHECK style button and label. This method is form ui compatible * * @param title * @param value * @param parent * @param toolkit * @return */ public static Button createLabeledCheck(String title, boolean value, Composite parent, FormToolkit toolkit) { Label label; Button button; if (toolkit == null) { label = new Label(parent, SWT.NONE); label.setText(title); button = new Button(parent, SWT.CHECK); } else { createFormLabel(title, parent, toolkit); button = toolkit.createButton(parent, null, SWT.CHECK); } GridData gridData = new GridData(SWT.FILL,SWT.BEGINNING,true,false); gridData.horizontalSpan = 2; button.setLayoutData(gridData); button.setSelection(value); return button; } /** * Creates a label and an editable Combo. * * @param title * @param values * @param parent * @return Combo */ public static Combo createLabeledCombo(String title, String[] values,Composite parent) { return SWTUtil.createLabeledCombo(title, values, parent, null); } /** * Creates a label and an editable Combo * * @param title * @param values * @param parent * @param toolkit * @return Combo */ public static Combo createLabeledCombo(String title, String[] values, Composite parent, FormToolkit toolkit) { Label label; if (toolkit == null) { label = new Label(parent, SWT.NONE); label.setText(title); } else { createFormLabel(title, parent, toolkit); } Combo combo = new Combo(parent, SWT.READ_ONLY); if (toolkit != null) { toolkit.adapt(combo, true, true); } GridData gridData = new GridData(SWT.FILL,SWT.BEGINNING,true,false); gridData.horizontalSpan = 2; combo.setLayoutData(gridData); for (int i = 0; i < values.length; i++) { combo.add(values[i]); } if (combo.getItemCount() > 0) combo.select(0); return combo; } /** * Creates a label and an editable Combo. * * @param title * @param values * @param parent * @return Combo */ public static Combo createLabeledEditableCombo(String title, String[] values,String value,Composite parent) { return SWTUtil.createLabeledEditableCombo(title, values,value, parent, null); } /** * Creates a label and an editable Combo * * @param title * @param values * @param parent * @param toolkit * @return Combo */ public static Combo createLabeledEditableCombo(String title, String[] values,String value, Composite parent, FormToolkit toolkit) { Label label; if (toolkit == null) { label = new Label(parent, SWT.NONE); label.setText(title); } else { createFormLabel(title, parent, toolkit); } Combo combo = new Combo(parent, SWT.SHADOW_IN | SWT.BORDER); if (toolkit != null) { toolkit.adapt(combo, true, true); } GridData gridData = new GridData(SWT.FILL,SWT.BEGINNING,true,false); gridData.horizontalSpan = 2; combo.setLayoutData(gridData); for (int i = 0; i < values.length; i++) { combo.add(values[i]); } if (combo.getItemCount() > 0) combo.select(0); combo.setText(value); return combo; } private static Label createFormLabel(String title, Composite parent, FormToolkit toolkit) { Label label; label = toolkit.createLabel(parent, title); label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); return label; } }