/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.studio.common.ui.widgets;
import org.apache.directory.studio.common.ui.CommonUIConstants;
import org.apache.directory.studio.common.ui.CommonUIPlugin;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Text;
/**
* This class provides utility methods to create SWT widgets.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class BaseWidgetUtils
{
/**
* Creates a SWT {@link Group} under the given parent.
*
* @param parent the parent
* @param label the label of the group
* @param span the horizontal span
* @return the created group
*/
public static Group createGroup( Composite parent, String label, int span )
{
Group group = new Group( parent, SWT.NONE );
GridData gridData = new GridData( GridData.FILL_BOTH );
gridData.horizontalSpan = span;
group.setLayoutData( gridData );
if ( label != null )
{
group.setText( label );
}
group.setLayout( new GridLayout() );
return group;
}
/**
* Creates a SWT {@link Composite} under the given parent.
* A GridLayout with the given number of columns is used.
*
* @param parent the parent
* @param columnCount the number of columns
* @param span the horizontal span
* @return the created composite
*/
public static Composite createColumnContainer( Composite parent, int columnCount, int span )
{
return createColumnContainer( parent, columnCount, false, span );
}
/**
* Creates a SWT {@link Composite} under the given parent.
* A GridLayout with the given number of columns is used.
*
* @param parent the parent
* @param columnCount the number of columns
* @param makeColumnsEqualWidth if the columns width should be equal
* @param span the horizontal span
* @return the created composite
*/
public static Composite createColumnContainer( Composite parent, int columnCount, boolean makeColumnsEqualWidth,
int span )
{
Composite container = new Composite( parent, SWT.NONE );
GridLayout gridLayout = new GridLayout( columnCount, makeColumnsEqualWidth );
gridLayout.marginHeight = gridLayout.marginWidth = 0;
container.setLayout( gridLayout );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
container.setLayoutData( gridData );
return container;
}
/**
* Creates a SWT {@link Label} under the given parent.
*
* @param parent the parent
* @param text the label's text
* @param span the horizontal span
* @return the created label
*/
public static Label createLabel( Composite parent, String text, int span )
{
Label label = new Label( parent, SWT.NONE );
GridData gridData = new GridData();
gridData.horizontalSpan = span;
label.setLayoutData( gridData );
label.setText( text );
return label;
}
/**
* Creates a SWT {@link Label} under the given parent.
* The label is created with the SWT.WRAP style to enable line wrapping.
*
* @param parent the parent
* @param text the label's text
* @param span the horizontal span
* @return the created label
*/
public static Label createWrappedLabel( Composite parent, String text, int span )
{
Label label = new Label( parent, SWT.WRAP );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
gridData.widthHint = 100;
label.setLayoutData( gridData );
label.setText( text );
return label;
}
/**
* Creates a SWT {@link Text} under the given parent.
* The created text control is modifiable.
*
* @param parent the parent
* @param text the initial text
* @param span the horizontal span
* @return the created text
*/
public static Text createText( Composite parent, String text, int span )
{
Text textWidget = new Text( parent, SWT.NONE | SWT.BORDER );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
textWidget.setLayoutData( gridData );
textWidget.setText( text );
return textWidget;
}
/**
* Creates a SWT {@link Text} under the given parent.
* The created text control is modifiable.
*
* @param parent the parent
* @param text the initial text
* @param textWidth the width of the text control
* @param span the horizontal span
* @return the created text
*/
public static Text createText( Composite parent, String text, int textWidth, int span )
{
Text textWidget = new Text( parent, SWT.NONE | SWT.BORDER );
GridData gridData = new GridData();
gridData.horizontalSpan = span;
gridData.widthHint = 9 * textWidth;
textWidget.setLayoutData( gridData );
textWidget.setText( text );
textWidget.setTextLimit( textWidth );
return textWidget;
}
/**
* Creates a SWT {@link Text} under the given parent.
* The created text control is created with the SWT.PASSWORD style.
*
* @param parent the parent
* @param text the initial text
* @param span the horizontal span
* @return the created text
*/
public static Text createPasswordText( Composite parent, String text, int span )
{
Text textWidget = new Text( parent, SWT.NONE | SWT.BORDER | SWT.PASSWORD );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
textWidget.setLayoutData( gridData );
textWidget.setText( text );
return textWidget;
}
/**
* Creates a SWT {@link Text} under the given parent.
* The created text control is created with the SWT.PASSWORD and
* SWT.READ_ONLY style. So the created controls is not modifiable.
*
* @param parent the parent
* @param text the initial text
* @param span the horizontal span
* @return the created text
*/
public static Text createReadonlyPasswordText( Composite parent, String text, int span )
{
Text textWidget = new Text( parent, SWT.NONE | SWT.BORDER | SWT.PASSWORD | SWT.READ_ONLY );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
textWidget.setLayoutData( gridData );
textWidget.setEditable( false );
textWidget.setBackground( parent.getBackground() );
textWidget.setText( text );
return textWidget;
}
/**
* Creates a SWT {@link Text} under the given parent.
* The created text control behaves like a label: it has no border,
* a grayed background and is not modifiable.
* But the text is selectable and could be copied.
*
* @param parent the parent
* @param text the initial text
* @param span the horizontal span
* @return the created text
*/
public static Text createLabeledText( Composite parent, String text, int span )
{
Text textWidget = new Text( parent, SWT.NONE );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
textWidget.setLayoutData( gridData );
textWidget.setEditable( false );
textWidget.setBackground( parent.getBackground() );
textWidget.setText( text );
return textWidget;
}
/**
* Creates a SWT {@link Text} under the given parent.
* The created text control behaves like a label: it has no border,
* a grayed background and is not modifiable.
* But the text is selectable and could be copied.
*
* @param parent the parent
* @param text the initial text
* @param span the horizontal span
* @param widthHint the width hint
* @return the created text
*/
public static Text createLabeledText( Composite parent, String text, int span, int widthHint )
{
Text textWidget = new Text( parent, SWT.NONE );
GridData gridData = new GridData( SWT.FILL, SWT.NONE, true, false );
gridData.horizontalSpan = span;
gridData.widthHint = widthHint;
textWidget.setLayoutData( gridData );
textWidget.setEditable( false );
textWidget.setBackground( parent.getBackground() );
textWidget.setText( text );
return textWidget;
}
/**
* Creates a SWT {@link Text} under the given parent.
* The created text control behaves like a label: it has no border,
* a grayed background and is not modifiable.
* But the text is selectable and could be copied.
* The label is created with the SWT.WRAP style to enable line wrapping.
*
* @param parent the parent
* @param text the initial text
* @param span the horizontal span
* @return the created text
*/
public static Text createWrappedLabeledText( Composite parent, String text, int span )
{
Text textWidget = new Text( parent, SWT.WRAP );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
gridData.widthHint = 10;
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
textWidget.setLayoutData( gridData );
textWidget.setEditable( false );
textWidget.setBackground( parent.getBackground() );
textWidget.setText( text );
return textWidget;
}
/**
* Creates a SWT {@link Text} under the given parent.
* The created text control behaves like a label: it has no border,
* a grayed background and is not modifiable.
* But the text is selectable and could be copied.
* The label is created with the SWT.WRAP style to enable line wrapping.
*
* @param parent the parent
* @param text the initial text
* @param span the horizontal span
* @param widthHint the width hint
* @return the created text
*/
public static Text createWrappedLabeledText( Composite parent, String text, int span, int widthHint )
{
Text textWidget = new Text( parent, SWT.WRAP );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
gridData.widthHint = widthHint;
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
textWidget.setLayoutData( gridData );
textWidget.setEditable( false );
textWidget.setBackground( parent.getBackground() );
textWidget.setText( text );
return textWidget;
}
/**
* Creates a SWT {@link Text} under the given parent.
* The text is not modifiable, but the text is selectable
* and could be copied.
*
* @param parent the parent
* @param text the initial text
* @param span the horizontal span
* @return the created text
*/
public static Text createReadonlyText( Composite parent, String text, int span )
{
Text textWidget = new Text( parent, SWT.NONE | SWT.BORDER | SWT.READ_ONLY );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
textWidget.setLayoutData( gridData );
textWidget.setEditable( false );
textWidget.setBackground( parent.getBackground() );
textWidget.setText( text );
return textWidget;
}
/**
* Creates a SWT {@link Combo} under the given parent.
* Beside the selection of an item it is also possible to type
* free text into the combo.
*
* @param parent the parent
* @param items the initial visible items
* @param selectedIndex the initial selected item, zero-based
* @param span the horizontal span
* @return the created combo
*/
public static Combo createCombo( Composite parent, String[] items, int selectedIndex, int span )
{
Combo combo = new Combo( parent, SWT.DROP_DOWN | SWT.BORDER );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
combo.setLayoutData( gridData );
combo.setItems( items );
combo.select( selectedIndex );
combo.setVisibleItemCount( 20 );
return combo;
}
/**
* Creates a SWT {@link Combo} under the given parent.
* It is not possible to type free text into the combo, only
* selection of predefined items is possible.
*
* @param parent the parent
* @param items the initial visible items
* @param selectedIndex the initial selected item, zero-based
* @param span the horizontal span
* @return the created combo
*/
public static Combo createReadonlyCombo( Composite parent, String[] items, int selectedIndex, int span )
{
Combo combo = new Combo( parent, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
combo.setLayoutData( gridData );
combo.setItems( items );
combo.select( selectedIndex );
combo.setVisibleItemCount( 20 );
return combo;
}
/**
* Creates a checkbox under the given parent.
*
* @param parent the parent
* @param text the label of the checkbox
* @param span the horizontal span
* @return the created checkbox
*/
public static Button createCheckbox( Composite parent, String text, int span )
{
Button checkbox = new Button( parent, SWT.CHECK );
checkbox.setText( text );
GridData gridData = new GridData();
gridData.horizontalSpan = span;
checkbox.setLayoutData( gridData );
return checkbox;
}
/**
* Creates a radio button under the given parent.
*
* @param parent the parent
* @param text the label of the radio button
* @param span the horizontal span
* @return the created radio button
*/
public static Button createRadiobutton( Composite parent, String text, int span )
{
Button radio = new Button( parent, SWT.RADIO );
radio.setText( text );
GridData gridData = new GridData();
gridData.horizontalSpan = span;
radio.setLayoutData( gridData );
return radio;
}
/**
* Creates a button under the given parent.
* The button width is set to the default width.
*
* @param parent the parent
* @param text the label of the button
* @param span the horizontal span
* @return the created button
*/
public static Button createButton( Composite parent, String text, int span )
{
GC gc = new GC( parent );
try
{
gc.setFont( JFaceResources.getDialogFont() );
FontMetrics fontMetrics = gc.getFontMetrics();
Button button = new Button( parent, SWT.PUSH );
GridData gridData = new GridData();
gridData.widthHint = Dialog.convertHorizontalDLUsToPixels( fontMetrics, IDialogConstants.BUTTON_WIDTH );
gridData.horizontalSpan = span;
button.setLayoutData( gridData );
button.setText( text );
return button;
}
finally
{
gc.dispose();
}
}
/**
* Adds some space to .
*
* @param parent the parent
* @param span the horizontal span
* @return the create label representing the radio buttons indent
*/
public static Label createRadioIndent( Composite parent, int span )
{
Label label = new Label( parent, SWT.NONE );
GridData gridData = new GridData();
gridData.horizontalSpan = span;
gridData.horizontalIndent = 22;
label.setLayoutData( gridData );
return label;
}
/**
* Creates a spacer.
*
* @param parent the parent
* @param span the horizontal span
* @return the create label representing the spacer
*/
public static Label createSpacer( Composite parent, int span )
{
Label label = new Label( parent, SWT.NONE );
GridData gridData = new GridData();
gridData.horizontalSpan = span;
gridData.heightHint = 1;
label.setLayoutData( gridData );
return label;
}
/**
* Creates a separator.
*
* @param parent the parent
* @param span the horizontal span
* @return the create label representing the separator
*/
public static Label createSeparator( Composite parent, int span )
{
Label label = new Label( parent, SWT.SEPARATOR | SWT.HORIZONTAL );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = span;
label.setLayoutData( gridData );
return label;
}
/**
* Creates a SWT {@link Link} under the given parent.
*
* @param parent the parent
* @param text the initial text
* @param span the horizontal span
* @return the created text
*/
public static Link createLink( Composite parent, String text, int span )
{
Link link = new Link( parent, SWT.NONE );
link.setText( text );
GridData gridData = new GridData( SWT.FILL, SWT.BEGINNING, true, false );
gridData.horizontalSpan = span;
gridData.widthHint = 150;
link.setLayoutData( gridData );
return link;
}
/**
* Creates a Text that can be used to enter an integer.
*
* @param toolkit the toolkit
* @param parent the parent
* @return a Text that is a valid integer
*/
public static Text createIntegerText( FormToolkit toolkit, Composite parent )
{
return createIntegerText( toolkit, parent, null, -1 );
}
/**
* Creates a Text that can be used to enter an integer.
*
* @param toolkit the toolkit
* @param parent the parent
* @param width the size of the input text to use
* @return a Text that is a valid integer
*/
public static Text createIntegerText( FormToolkit toolkit, Composite parent, int width )
{
return createIntegerText( toolkit, parent, null, width );
}
/**
* Creates a Text that can be used to enter an integer.
*
* @param toolkit the toolkit
* @param parent the parent
* @param description the description that has to be added after the inmput text
* @return a Text that is a valid integer
*/
public static Text createIntegerText( FormToolkit toolkit, Composite parent, String description )
{
return createIntegerText( toolkit, parent, description, -1 );
}
/**
* Creates a Text that can be used to enter an integer.
*
* @param toolkit the toolkit
* @param parent the parent
* @param description the description that has to be added after the inmput text
* @param width the size of the input text to use
* @return a Text that is a valid integer
*/
public static Text createIntegerText( FormToolkit toolkit, Composite parent, String description, int width )
{
Text integerText = toolkit.createText( parent, "" ); //$NON-NLS-1$
integerText.addVerifyListener( new VerifyListener()
{
public void verifyText( VerifyEvent e )
{
for ( int i = 0; i < e.text.length(); i++ )
{
if ( !Character.isDigit( e.text.charAt( i ) ) )
{
e.doit = false;
break;
}
}
}
} );
// Add the description, if needed
if ( ( description != null ) && ( description.length() > 0 ) )
{
ControlDecoration monitoringCheckboxDecoration = new ControlDecoration(
integerText, SWT.CENTER | SWT.RIGHT );
monitoringCheckboxDecoration.setImage( CommonUIPlugin.getDefault().getImageDescriptor(
CommonUIConstants.IMG_INFORMATION ).createImage() );
monitoringCheckboxDecoration.setMarginWidth( 4 );
monitoringCheckboxDecoration.setDescriptionText( description );
}
if ( width >= 0 )
{
GridData gridData = new GridData();
gridData.widthHint = width;
integerText.setLayoutData( gridData );
}
return integerText;
}
/**
* Set a value in a Button, if it's not null
*
* @param value The Value to set
* @param checkBox The Button which will be checked if the value is not null and set to True
*/
public static void setValue( Boolean value, Button checkBox )
{
if ( value != null )
{
checkBox.setSelection( value );
}
else
{
checkBox.setSelection( false );
}
}
/**
* Set a value in a Text, if it's not null
*
* @param value The Value to set
* @param inputText The Text which will be set if the value is not null
*/
public static void setValue( Integer value, Text inputText )
{
if ( value != null )
{
inputText.setText( value.toString() );
}
else
{
inputText.setText( "" );
}
}
/**
* Set a value in a Text, if it's not null
*
* @param value The Value to set
* @param checkBox The Text which will be set if the value is not null
*/
public static void setValue( String value, Text inputText )
{
if ( value != null )
{
inputText.setText( value );
}
else
{
inputText.setText( "" );
}
}
}