/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* 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:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.ui.utils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jubula.tools.internal.messagehandling.MessageIDs;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
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.Label;
import org.eclipse.swt.widgets.Text;
/**
* This class contains constants to be used for the layout of all components
* which will be displayed graphical. (GUI)
*
* @author BREDEX GmbH
* @created 15.10.2004
*/
public class LayoutUtil {
/** value for 0, use the detailed constant! */
public static final int ZERO = 0;
/** value for SMALL_XXX, use the detailed constant! */
public static final int SMALL = 10;
/** value for BIG_XXX, use the detailed constant! */
public static final int BIG = 15;
/** value for max. chars-width of a control, use the detailed constant! */
public static final int WIDTH = 30;
// constants for all layouts
/** small margin width, for all layouts */
public static final int SMALL_MARGIN_WIDTH = SMALL;
/** big margin width, for all layouts */
public static final int BIG_MARGIN_WIDTH = BIG;
/** small margin height, for all layouts */
public static final int SMALL_MARGIN_HEIGHT = SMALL;
/** big margin height, for all layouts */
public static final int BIG_MARGIN_HEIGHT = BIG;
/** small horizontal spacing */
public static final int SMALL_HORIZONTAL_SPACING = SMALL;
/** big horizontal spacing */
public static final int BIG_HORIZONTAL_SPACING = BIG;
/** small vertical spacing */
public static final int SMALL_VERTICAL_SPACING = SMALL;
/** big vertical spacing */
public static final int BIG_VERTICAL_SPACING = BIG;
// constants for alignment
/** the horizontal alignment for controls, except labels, m_text */
public static final int HORIZONTAL_ALIGNMENT = SWT.FILL;
/** the horizontal alignmemt for labels */
public static final int LABEL_HORIZONTAL_ALIGNMENT = SWT.END;
/**the horizontal alignmemt for labels in a GridLayout with more than two columns */
public static final int MULTI_COLUMN_LABEL_HORIZONTAL_ALIGNMENT =
SWT.BEGINNING;
/** the horizontal alignmemt for textfields */
public static final int TEXT_HORIZONTAL_ALIGNMENT = SWT.BEGINNING;
/** the horizontal alignmemt for multi line textfields in a GridLayout */
public static final int MULTI_LINE_TEXT_HORIZONTAL_ALIGNMENT = SWT.FILL;
/** the vertical algnment for all controls */
public static final int VERTICAL_ALIGNMENT = SWT.CENTER;
// style for controls
/** the style for a single - line m_text */
public static final int SINGLE_TEXT_STYLE = SWT.SINGLE | SWT.BORDER;
/** the style for a multi - line m_text */
public static final int MULTI_TEXT_STYLE = SWT.MULTI | SWT.BORDER
| SWT.V_SCROLL | SWT.H_SCROLL;
/** the style for a multi - line text without border*/
public static final int MULTI_TEXT = SWT.MULTI | SWT.WRAP;
/** margin width = 2 */
public static final int MARGIN_WIDTH = 2;
/** margin height = 2 */
public static final int MARGIN_HEIGHT = 2;
// -------------------------------------------------------------
// Colors
// -------------------------------------------------------------
/** color gray for disabled GUI elements (foreground) */
public static final Color LIGHT_GRAY_COLOR = new Color(
Display.getDefault(), new RGB(238, 238, 238));
/** color gray for disabled GUI elements (foreground) */
public static final Color GRAY_COLOR = new Color(
Display.getDefault(), new RGB(100, 100, 100));
/** color for inactive GUI elements */
public static final Color INACTIVE_COLOR = Display.getDefault()
.getSystemColor(SWT.COLOR_DARK_GREEN);
/** default color (mostly black) for GUI elements */
public static final Color DEFAULT_OS_COLOR = null;
// -------------------------------------------------------------
// Font
// -------------------------------------------------------------
/**
* <code>FONT_NAME</code>
*/
public static final String FONT_NAME = "Tahoma"; //$NON-NLS-1$
/**
* <code>FONT_HEIGHT</code>
*/
public static final int FONT_HEIGHT = 9;
/** bold tahoma font, size: 9 */
public static final Font BOLD_TAHOMA = new Font(null, FONT_NAME,
FONT_HEIGHT, SWT.BOLD);
/** bold,italic tahoma font, size: 9 */
public static final Font BOLD_ITALIC_TAHOMA = new Font(null, FONT_NAME,
FONT_HEIGHT, SWT.BOLD | SWT.ITALIC);
/** italic tahoma font, size: 9 */
public static final Font ITALIC_TAHOMA = new Font(null, FONT_NAME,
FONT_HEIGHT, SWT.ITALIC);
/** tahoma font, size: 9 */
public static final Font NORMAL_TAHOMA = new Font(null, FONT_NAME,
FONT_HEIGHT, SWT.NORMAL);
/**
* do not instantiate this class
*/
private LayoutUtil() {
super();
}
/**
* Sets a character limit (255) for the text field (incl. warning, if limit was reached)
* @param textField The actual text field.
*/
public static void setMaxChar(final Text textField) {
setMaxChar(textField, 255);
}
/**
* Sets a character limit for the text field (incl. warning, if limit was reached)
* @param textField The actual text field.
* @param maxLength the max size of input
*/
public static void setMaxChar(final Text textField, final int maxLength) {
if (textField == null) {
return;
}
textField.setTextLimit(maxLength);
textField.addModifyListener(new ModifyListener() {
/**
* <code>m_oldValue</code> the old value
*/
private String m_oldValue = textField.getText();
public void modifyText(ModifyEvent e) {
Text theWidget = ((Text)e.widget);
if (theWidget.getCharCount() >= maxLength) {
ErrorHandlingUtil.createMessageDialog(
MessageIDs.W_MAX_CHAR,
new Object[] {maxLength}, null);
theWidget.setText(m_oldValue);
}
m_oldValue = theWidget.getText();
}
});
}
/**
* Defines a constant width for a control and shows a tool tip with the text
* of this control, when this text is longer than the constant width.
* @param gridData The gridData object.
* @param control The actual SWT control.
*/
public static void addToolTipAndMaxWidth(GridData gridData,
final Control control) {
gridData.widthHint = Dialog.convertWidthInCharsToPixels(
LayoutUtil.getFontMetrics(control), LayoutUtil.WIDTH);
if (control instanceof Text) {
final Text textField = (Text)control;
setVisibilityToolTip(textField, textField.getText());
textField.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
setVisibilityToolTip(textField, textField.getText());
}
});
} else if (control instanceof Combo) {
final Combo combo = (Combo)control;
setVisibilityToolTip(combo, combo.getText());
combo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
setVisibilityToolTip(combo, combo.getText());
}
});
}
}
/**
* Sets the tooltip for a control if its text does not fit within its
* bounds. Otherwise clears the tooltip for the control.
*
* @param control The control for which to set/clear the tooltip.
* @param text The text in the control.
*/
private static void setVisibilityToolTip(Control control, String text) {
int width = Dialog.convertWidthInCharsToPixels(
LayoutUtil.getFontMetrics(control), text.length());
if (width > control.getBounds().width) {
control.setToolTipText(text);
} else {
control.setToolTipText(null);
}
}
/**
* creates a small skip for GridLayout
* @param parent the composite to creat the skip in
* @param numColumns the number of the columns
* @return a control representing a small skip
*/
public static Control createGridSmallSkip(Composite parent,
int numColumns) {
Label result = new Label(parent, SWT.NONE);
GridData gd = new GridData();
gd.horizontalSpan = numColumns;
gd.heightHint = SMALL_VERTICAL_SPACING;
result.setLayoutData(gd);
return result;
}
/**
* creates a big skip for GridLayout
* @param parent the composite to creat the skip in
* @param numColumns the number of the columns
* @return a control representing a big skip
*/
public static Control createGridBigSkip(Composite parent, int numColumns) {
Label result = new Label(parent, SWT.NONE);
GridData gd = new GridData();
gd.horizontalSpan = numColumns;
gd.heightHint = BIG_VERTICAL_SPACING;
result.setLayoutData(gd);
return result;
}
/**
* creates a GridData for labels with default layout
* @return a new instance of GridData
*/
public static GridData createDefaultLabelGridData() {
GridData result = new GridData();
result.horizontalAlignment = LABEL_HORIZONTAL_ALIGNMENT;
result.verticalAlignment = VERTICAL_ALIGNMENT;
result.horizontalSpan = 1;
result.verticalSpan = 1;
return result;
}
/**
* creates a GridData for labels in a GridLayout with more than two columns
* @return a new instance of GridData
*/
public static GridData createMultiColumnLabelGridData() {
GridData result = new GridData();
result.horizontalAlignment = MULTI_COLUMN_LABEL_HORIZONTAL_ALIGNMENT;
result.verticalAlignment = VERTICAL_ALIGNMENT;
result.horizontalSpan = 1;
result.verticalSpan = 1;
result.horizontalIndent = BIG_HORIZONTAL_SPACING;
return result;
}
/**
* creates a GridData for labels which are aligned at the top of the cell
* <br>
* use it for labels for control which take more space as usual, e.g. a multi line textfield.
* @return a new instance of GridData
*/
public static GridData createTopLabelGridData() {
GridData result = new GridData();
result.horizontalAlignment = LABEL_HORIZONTAL_ALIGNMENT;
result.verticalAlignment = SWT.BEGINNING;
result.horizontalSpan = 1;
result.verticalSpan = 1;
return result;
}
/**
* creates a GridData for textfields with default layout
* @return a new instance of GridData
*/
public static GridData createDefaultTextGridData() {
return createDefaultTextGridData(1);
}
/**
* creates a GridData for textfields with default layout (fills one column)
* @param numColumns number of columns to span
* @return a new instance of GridData
*/
public static GridData createDefaultTextGridData(int numColumns) {
GridData result = createTextGridData();
result.horizontalSpan = numColumns;
return result;
}
/**
* creates a GridData for textfields with default layout, give a number of expected characters as a hint
* @param control the m_text control, used to determine the FontMetrics
* @param numChars number of characters textfield should contain
* @return a new instance of GridData
*/
public static GridData createDefaultTextGridData(Control control,
int numChars) {
GridData result = new GridData();
result.horizontalAlignment = TEXT_HORIZONTAL_ALIGNMENT;
result.verticalAlignment = VERTICAL_ALIGNMENT;
result.horizontalSpan = 1;
result.verticalSpan = 1;
result.widthHint = Dialog.convertWidthInCharsToPixels(
getFontMetrics(control), numChars);
return result;
}
/**
* creates a GridData for multi line textfields, give a number of lines as a hint
* @param control the m_text control, used to determine the FontMetrics
* @param numLines number of lines the textfield should contain
* @return a new instance of GridData
*/
public static GridData createMultiLineTextGridData(Control control,
int numLines) {
GridData result = new GridData();
result.horizontalAlignment = MULTI_LINE_TEXT_HORIZONTAL_ALIGNMENT;
result.verticalAlignment = VERTICAL_ALIGNMENT;
result.horizontalSpan = 1;
result.verticalSpan = 1;
result.heightHint = Dialog.convertHeightInCharsToPixels(
getFontMetrics(control), numLines);
return result;
}
/** creates a m_text grid data for textfields
* @return a new instance of GridData
*/
private static GridData createTextGridData() {
GridData result = new GridData();
result.horizontalAlignment = HORIZONTAL_ALIGNMENT;
result.verticalAlignment = VERTICAL_ALIGNMENT;
result.verticalSpan = 1;
return result;
}
/**
* returns the FontMetrics of <code>control</code>
* @param control the control to get the font metrics from
* @return the FontMetrics
*/
public static FontMetrics getFontMetrics(Control control) {
GC gc = new GC(control);
gc.setFont(control.getFont());
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
return fontMetrics;
}
/**
* @param area The composite.
* creates a separator
*/
public static void createSeparator(Composite area) {
Label label = new Label(area, SWT.SEPARATOR | SWT.HORIZONTAL);
GridData gridData = new GridData();
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
label.setLayoutData(gridData);
}
}