package tk.eclipse.plugin.htmleditor.gefutils; import java.text.MessageFormat; import org.eclipse.jface.viewers.CellEditor; 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.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.views.properties.PropertyDescriptor; /** * The base class for selection dialog property descriptors. * * @author Naoki Takezoe */ public abstract class AbstractDialogPropertyDescriptor extends PropertyDescriptor { public AbstractDialogPropertyDescriptor(Object id, String displayName) { super(id, displayName); } @Override public CellEditor createPropertyEditor(Composite parent) { ValueCellEditor editor = new ValueCellEditor(parent); if (getValidator() != null){ editor.setValidator(getValidator()); } return editor; } protected abstract Object openDialogBox(Object value, Control cellEditorWindow); protected class ValueCellEditor extends CellEditor { private Text _text; private Composite _editor; private Button _button; private boolean _isSelection = false; private boolean _isDeleteable = false; private boolean _isSelectable = false; private Object _value = null; private class DialogCellLayout extends Layout { @Override public void layout(Composite editor, boolean force) { Rectangle bounds = editor.getClientArea(); Point size = _button.computeSize(SWT.DEFAULT, SWT.DEFAULT, force); if (_text != null){ _text.setBounds(0, 0, bounds.width-size.x, bounds.height); } _button.setBounds(bounds.width-size.x, 0, size.x, bounds.height); } @Override public Point computeSize(Composite editor, int wHint, int hHint, boolean force) { if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT){ return new Point(wHint, hHint); } Point contentsSize = _text.computeSize(SWT.DEFAULT, SWT.DEFAULT, force); Point buttonSize = _button.computeSize(SWT.DEFAULT, SWT.DEFAULT, force); Point result = new Point(buttonSize.x,Math.max(contentsSize.y, buttonSize.y)); return result; } } public ValueCellEditor(Composite parent) { super(parent, SWT.NONE); } @Override protected Control createControl(Composite parent) { Font font = parent.getFont(); Color bg = parent.getBackground(); _editor = new Composite(parent, getStyle()); _editor.setFont(font); _editor.setBackground(bg); _editor.setLayout(new DialogCellLayout()); _text = new Text(_editor,SWT.NULL); _text.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.character == '\u001b') { // Escape fireCancelEditor(); } else if (e.character == '\r'){ // Enter Object newValue = _text.getText(); updateValue(newValue); } } @Override public void keyPressed(KeyEvent e) { checkSelection(); checkDeleteable(); checkSelectable(); } }); _text.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { checkSelection(); checkDeleteable(); checkSelectable(); } }); _text.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { Object newValue = _text.getText(); updateValue(newValue); } }); _text.setFont(parent.getFont()); _text.setBackground(parent.getBackground()); _button = new Button(_editor, SWT.DOWN); _button.setText("..."); _button.setFont(font); _button.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if (e.character == '\u001b') { // Escape fireCancelEditor(); } } }); _button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { Object newValue = openDialogBox(_editor); if (newValue != null) { updateValue(newValue); } } }); setValueValid(true); updateContents(_value); return _editor; } private void updateValue(Object newValue){ if (newValue != null) { boolean newValidState = isCorrect(newValue); if (newValidState) { markDirty(); doSetValue(newValue); } else { setErrorMessage(MessageFormat.format(getErrorMessage(), new Object[] { newValue.toString()})); } fireApplyEditorValue(); } } @Override protected Object doGetValue() { return _value; } @Override protected void doSetFocus() { _button.setFocus(); // text.setFocus(); // text.selectAll(); checkSelection(); checkDeleteable(); checkSelectable(); } @Override protected void doSetValue(Object value) { this._value = value; updateContents(value); } private void checkDeleteable() { boolean oldIsDeleteable = _isDeleteable; _isDeleteable = isDeleteEnabled(); if (oldIsDeleteable != _isDeleteable) { fireEnablementChanged(DELETE); } } private void checkSelectable() { boolean oldIsSelectable = _isSelectable; _isSelectable = isSelectAllEnabled(); if (oldIsSelectable != _isSelectable) { fireEnablementChanged(SELECT_ALL); } } private void checkSelection() { boolean oldIsSelection = _isSelection; _isSelection = _text.getSelectionCount() > 0; if (oldIsSelection != _isSelection) { fireEnablementChanged(COPY); fireEnablementChanged(CUT); } } @Override public boolean isCopyEnabled() { if (_text == null || _text.isDisposed()) return false; return _text.getSelectionCount() > 0; } @Override public boolean isCutEnabled() { if (_text == null || _text.isDisposed()) return false; return _text.getSelectionCount() > 0; } @Override public boolean isDeleteEnabled() { if (_text == null || _text.isDisposed()) return false; return _text.getSelectionCount() > 0 || _text.getCaretPosition() < _text.getCharCount(); } @Override public boolean isPasteEnabled() { if (_text == null || _text.isDisposed()) return false; return true; } public boolean isSaveAllEnabled() { if (_text == null || _text.isDisposed()) return false; return true; } @Override public boolean isSelectAllEnabled() { if (_text == null || _text.isDisposed()) return false; return _text.getCharCount() > 0; } @Override public void performCopy() { _text.copy(); } @Override public void performCut() { _text.cut(); checkSelection(); checkDeleteable(); checkSelectable(); } @Override public void performDelete() { if (_text.getSelectionCount() > 0) // remove the contents of the current selection _text.insert(""); //$NON-NLS-1$ else { // remove the next character int pos = _text.getCaretPosition(); if (pos < _text.getCharCount()) { _text.setSelection(pos, pos + 1); _text.insert(""); //$NON-NLS-1$ } } checkSelection(); checkDeleteable(); checkSelectable(); } @Override public void performPaste() { _text.paste(); checkSelection(); checkDeleteable(); checkSelectable(); } @Override public void performSelectAll() { _text.selectAll(); checkSelection(); checkDeleteable(); } protected Object openDialogBox(Control cellEditorWindow){ return AbstractDialogPropertyDescriptor.this.openDialogBox(_value, cellEditorWindow); } protected void updateContents(Object value) { if (this._text == null){ return; } String text = "";//$NON-NLS-1$ if (value != null){ text = value.toString(); } this._text.setText(text); } } }