blob: 68d1fa53e4571fb8c614ed1d5f1384f74477c64c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2014 Eric Rizzo 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:
* Eric Rizzo - initial implementation
* Jeanderson Candido <http://jeandersonbc.github.io> - Bug 414565
*******************************************************************************/
package org.eclipse.jface.snippets.viewers;
import java.text.MessageFormat;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.DialogCellEditor;
import org.eclipse.jface.window.Window;
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.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
/**
* A CellEditor that is a blending of DialogCellEditor and TextCellEditor. The
* user can either type directly into the Text or use the button to open a
* Dialog for editing the cell's value.
*
*/
public class TextAndDialogCellEditor extends DialogCellEditor {
private Text textField;
private String dialogMessage;
private String dialogTitle;
public TextAndDialogCellEditor(Composite parent) {
super(parent);
}
public void setDialogMessage(String dialogMessage) {
this.dialogMessage = dialogMessage;
}
public void setDialogTitle(String dialogTitle) {
this.dialogTitle = dialogTitle;
}
@Override
protected Control createContents(Composite cell) {
textField = new Text(cell, SWT.NONE);
textField.setFont(cell.getFont());
textField.setBackground(cell.getBackground());
textField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent event) {
setValueToModel();
}
});
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent event) {
keyReleaseOccured(event);
}
});
return textField;
}
@Override
protected void keyReleaseOccured(KeyEvent keyEvent) {
if (keyEvent.keyCode == SWT.CR || keyEvent.keyCode == SWT.KEYPAD_CR) {
// Enter key
setValueToModel();
}
super.keyReleaseOccured(keyEvent);
}
protected void setValueToModel() {
String newValue = textField.getText();
boolean newValidState = isCorrect(newValue);
if (newValidState) {
markDirty();
doSetValue(newValue);
} else {
// try to insert the current value into the error message.
setErrorMessage(MessageFormat.format(getErrorMessage(), newValue.toString()));
}
}
@Override
protected void updateContents(Object value) {
if (textField == null) {
return;
}
String text = "";
if (value != null) {
text = value.toString();
}
textField.setText(text);
}
@Override
protected void doSetFocus() {
// Overridden to set focus to the Text widget instead of the Button.
textField.setFocus();
textField.selectAll();
}
@Override
protected Object openDialogBox(Control cellEditorWindow) {
InputDialog dialog = new InputDialog(cellEditorWindow.getShell(),
dialogTitle, dialogMessage, getDialogInitialValue(), null);
return (dialog.open() == Window.OK ? dialog.getValue() : null);
}
protected String getDialogInitialValue() {
Object value = getValue();
return (value == null ? null : value.toString());
}
}