blob: f2753f3f6678c5dfb67a55db36da1e7a7596228d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 Sybase, Inc. and others.
*
* All rights reserved. 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* Dialog field containing a label and a text control.
*/
public class StringDialogField extends DialogFieldBase implements
ISupportTextValue {
final static private int TEXT_WIDTH_HINT = 10;
private String _text;
private Text _textControl;
private ModifyListener _modifyListener;
private int _numRows;
/**
* whether there is change in the UI but not fire applied event yet.
*/
private boolean _pending = false;
/**
* default constructor
* numRows == 1
*/
public StringDialogField() {
this(1);
_text = ""; //$NON-NLS-1$
}
/**
* @param numRows
*/
public StringDialogField(int numRows) {
super();
_text = ""; //$NON-NLS-1$
_numRows = numRows;
}
// ------- layout helpers
/*
* @see DialogField#doFillIntoGrid
*/
public Control[] doFillIntoGrid(FormToolkit kit, Composite parent,
int nColumns) {
assertEnoughColumns(nColumns);
Control requiredLabel = getRequiredLabelControl(kit, parent);
requiredLabel.setLayoutData(gridDataForLabel(1));
Control label = getLabelControl(kit, parent);
label.setLayoutData(gridDataForLabel(1));
Text text = getTextControl(kit, parent);
int heightHint = -1;
if (_numRows > 1) {
heightHint = getDialogUnits(parent).getHeight() * _numRows;
}
text.setLayoutData(gridDataForText(nColumns - 2, heightHint));
return new Control[] { requiredLabel, label, text };
}
/*
* @see DialogField#getNumberOfControls
*/
public int getNumberOfControls() {
return 3;
}
protected static GridData gridDataForLabel(int span) {
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = span;
return gd;
}
/**
* @param span
* @param heightHint
* @return the grid data for text
*/
protected static GridData gridDataForText(int span, int heightHint) {
GridData gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
gd.grabExcessHorizontalSpace = false;
gd.heightHint = heightHint;
gd.horizontalSpan = span;
gd.widthHint = TEXT_WIDTH_HINT;
return gd;
}
/**
* @param span
* @return the grid data for text
*/
protected static GridData gridDataForText(int span) {
GridData gd = gridDataForText(span, -1);
return gd;
}
// ------- focus methods
/*
* @see DialogField#setFocus
*/
public boolean setFocus() {
if (isOkToUse(_textControl)) {
_textControl.setFocus();
_textControl.setSelection(0, _textControl.getText().length());
}
return true;
}
// ------- ui creation
/**
* Creates or returns the created text control.
* @param toolkit
*
* @param parent
* The parent composite or <code>null</code> when the widget
* has already been created.
* @return the text control
*/
public Text getTextControl(FormToolkit toolkit, Composite parent) {
if (_textControl == null || _textControl.isDisposed()) {
assertCompositeNotNull(parent);
_modifyListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
doModifyText(e);
}
};
if (toolkit != null) {
if (_numRows <= 1) {
_textControl = toolkit.createText(parent, ""); //$NON-NLS-1$
} else {
_textControl = toolkit.createText(parent, "", SWT.V_SCROLL); //$NON-NLS-1$
}
} else {
if (_numRows <= 1) {
_textControl = new Text(parent, SWT.SINGLE | SWT.BORDER);
} else {
_textControl = new Text(parent, SWT.V_SCROLL | SWT.WRAP
| SWT.BORDER);
}
}
_textControl.setText(_text);
_textControl.setFont(parent.getFont());
_textControl.addModifyListener(_modifyListener);
_textControl.addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent e) {
doFocusLost(e);
}
});
_textControl.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
doKeyReleased(e);
}
});
_textControl.setEnabled(isEnabled());
_textControl.setToolTipText(getToolTip());
}
return _textControl;
}
/**
* @param e
*/
protected void doKeyReleased(KeyEvent e) {
if (e.character == '\r') {
// commit value
if (_pending) {
_pending = false;
dialogFieldApplied();
}
}
}
/**
* @param e
*/
protected void doFocusLost(FocusEvent e) {
if (_pending) {
_pending = false;
dialogFieldApplied();
}
}
/**
* some get changed in the Text. As in <code>setText</code> and
* <code>setTextWithoutUpdate</code> we removed the listener, so this must
* be user typing in the text field.
*
* @param e
*/
private void doModifyText(ModifyEvent e) {
if (isOkToUse(_textControl)) {
_text = _textControl.getText();
}
_pending = true;
dialogFieldChanged();
}
// ------ enable / disable management
/*
* @see DialogField#updateEnableState
*/
protected void updateEnableState() {
super.updateEnableState();
if (isOkToUse(_textControl)) {
_textControl.setEnabled(isEnabled());
}
}
// ------ text access
/**
* Gets the text. Can not be <code>null</code>
*/
public String getText() {
return _text;
}
/**
* Sets the text. Triggers a dialog-changed event.
*/
public void setText(String text) {
setTextWithoutUpdate(text);
dialogFieldChangedAndApplied();
}
/**
* Sets the text without triggering a dialog-changed event.
*/
public void setTextWithoutUpdate(String text) {
// reset _pending state.
_pending = false;
if (text == null)
text = ""; //$NON-NLS-1$
_text = text;
if (isOkToUse(_textControl)) {
_textControl.removeModifyListener(_modifyListener);
_textControl.setText(text);
_textControl.addModifyListener(_modifyListener);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
*/
public void handleGrabHorizontal() {
LayoutUtil.setGrabHorizontal(_textControl, true);
}
}