///*******************************************************************************
// * Copyright (c) 2000, 2006 IBM Corporation and others.
// * 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:
// * IBM Corporation - initial API and implementation
// *******************************************************************************/
//package org.eclipse.jface.viewers;
//
//import java.text.MessageFormat;
//
//import org.eclipse.jface.resource.*;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.events.*;
//import org.eclipse.swt.graphics.*;
//import org.eclipse.swt.widgets.*;
//
///**
// * An abstract cell editor that uses a dialog.
// * Dialog cell editors usually have a label control on the left and a button on
// * the right. Pressing the button opens a dialog window (for example, a color dialog
// * or a file dialog) to change the cell editor's value.
// * The cell editor's value is the value of the dialog.
// * <p>
// * Subclasses may override the following method:
// * <ul>
// * <li><code>createButton</code>: creates the cell editor's button control</li>
// * <li><code>openDialogBox</code>: opens the dialog box when the end user presses
// * the button</li>
// * <li><code>updateLabel</code>: updates the cell editor's label after its
// * value has changed</li>
// * </ul>
// * </p>
// */
//public abstract class DialogCellEditor extends CellEditor {
//
// /**
// * Image registry key for three dot image (value <code>"cell_editor_dots_button_image"</code>).
// */
// public static final String CELL_EDITOR_IMG_DOTS_BUTTON = "cell_editor_dots_button_image";//$NON-NLS-1$
//
// /**
// * The editor control.
// */
// private Composite editor;
//
// /**
// * The current contents.
// */
// private Control contents;
//
// /**
// * The label that gets reused by <code>updateLabel</code>.
// */
// private Label defaultLabel;
//
// /**
// * The button.
// */
// private Button button;
//
// /**
// * Listens for 'focusLost' events and fires the 'apply' event as long
// * as the focus wasn't lost because the dialog was opened.
// */
// private FocusListener buttonFocusListener;
//
// /**
// * The value of this cell editor; initially <code>null</code>.
// */
// private Object value = null;
//
// static {
// ImageRegistry reg = JFaceResources.getImageRegistry();
// reg.put(CELL_EDITOR_IMG_DOTS_BUTTON, ImageDescriptor.createFromFile(
// DialogCellEditor.class, "images/dots_button.gif"));//$NON-NLS-1$
// }
//
// /**
// * Internal class for laying out the dialog.
// */
// private class DialogCellLayout extends Layout {
// public void layout(Composite editor, boolean force) {
// Rectangle bounds = editor.getClientArea();
// Point size = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
// if (contents != null) {
// contents.setBounds(0, 0, bounds.width - size.x, bounds.height);
// }
// button.setBounds(bounds.width - size.x, 0, size.x, bounds.height);
// }
//
// 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 = contents.computeSize(SWT.DEFAULT, SWT.DEFAULT,
// force);
// Point buttonSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
// force);
// // Just return the button width to ensure the button is not clipped
// // if the label is long.
// // The label will just use whatever extra width there is
// Point result = new Point(buttonSize.x, Math.max(contentsSize.y,
// buttonSize.y));
// return result;
// }
// }
//
// /**
// * Default DialogCellEditor style
// */
// private static final int defaultStyle = SWT.NONE;
//
// /**
// * Creates a new dialog cell editor with no control
// * @since 1.0
// */
// public DialogCellEditor() {
// setStyle(defaultStyle);
// }
//
// /**
// * Creates a new dialog cell editor parented under the given control.
// * The cell editor value is <code>null</code> initially, and has no
// * validator.
// *
// * @param parent the parent control
// */
// protected DialogCellEditor(Composite parent) {
// this(parent, defaultStyle);
// }
//
// /**
// * Creates a new dialog cell editor parented under the given control.
// * The cell editor value is <code>null</code> initially, and has no
// * validator.
// *
// * @param parent the parent control
// * @param style the style bits
// * @since 1.0
// */
// protected DialogCellEditor(Composite parent, int style) {
// super(parent, style);
// }
//
// /**
// * Creates the button for this cell editor under the given parent control.
// * <p>
// * The default implementation of this framework method creates the button
// * display on the right hand side of the dialog cell editor. Subclasses
// * may extend or reimplement.
// * </p>
// *
// * @param parent the parent control
// * @return the new button control
// */
// protected Button createButton(Composite parent) {
// Button result = new Button(parent, SWT.DOWN);
// result.setText("..."); //$NON-NLS-1$
// return result;
// }
//
// /**
// * Creates the controls used to show the value of this cell editor.
// * <p>
// * The default implementation of this framework method creates
// * a label widget, using the same font and background color as the parent control.
// * </p>
// * <p>
// * Subclasses may reimplement. If you reimplement this method, you
// * should also reimplement <code>updateContents</code>.
// * </p>
// *
// * @param cell the control for this cell editor
// * @return the underlying control
// */
// protected Control createContents(Composite cell) {
// defaultLabel = new Label(cell, SWT.LEFT);
// defaultLabel.setFont(cell.getFont());
// defaultLabel.setBackground(cell.getBackground());
// return defaultLabel;
// }
//
// /* (non-Javadoc)
// * Method declared on CellEditor.
// */
// 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());
//
// contents = createContents(editor);
// updateContents(value);
//
// button = createButton(editor);
// button.setFont(font);
//
//// button.addKeyListener(new KeyAdapter() {
//// /* (non-Javadoc)
//// * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
//// */
//// public void keyReleased(KeyEvent e) {
//// if (e.character == '\u001b') { // Escape
//// fireCancelEditor();
//// }
//// }
//// });
//
// button.addFocusListener(getButtonFocusListener());
//
// button.addSelectionListener(new SelectionAdapter() {
// /* (non-Javadoc)
// * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
// */
// public void widgetSelected(SelectionEvent event) {
// // Remove the button's focus listener since it's guaranteed
// // to lose focus when the dialog opens
// button.removeFocusListener(getButtonFocusListener());
//
// Object newValue = openDialogBox(editor);
//
// // Re-add the listener once the dialog closes
// button.addFocusListener(getButtonFocusListener());
//
// if (newValue != null) {
// boolean newValidState = isCorrect(newValue);
// if (newValidState) {
// markDirty();
// doSetValue(newValue);
// } else {
// // try to insert the current value into the error message.
// setErrorMessage(MessageFormat.format(getErrorMessage(),
// new Object[] { newValue.toString() }));
// }
// fireApplyEditorValue();
// }
// }
// });
//
// setValueValid(true);
//
// return editor;
// }
//
// /* (non-Javadoc)
// *
// * Override in order to remove the button's focus listener if the celleditor
// * is deactivating.
// *
// * @see org.eclipse.jface.viewers.CellEditor#deactivate()
// */
// public void deactivate() {
// if (button != null && !button.isDisposed()) {
// button.removeFocusListener(getButtonFocusListener());
// }
//
// super.deactivate();
// }
//
// /* (non-Javadoc)
// * Method declared on CellEditor.
// */
// protected Object doGetValue() {
// return value;
// }
//
// /* (non-Javadoc)
// * Method declared on CellEditor.
// * The focus is set to the cell editor's button.
// */
// protected void doSetFocus() {
// button.setFocus();
//
// // add a FocusListener to the button
// button.addFocusListener(getButtonFocusListener());
// }
//
// /**
// * Return a listener for button focus.
// * @return FocusListener
// */
// private FocusListener getButtonFocusListener() {
// if (buttonFocusListener == null) {
// buttonFocusListener = new FocusListener() {
//
// /* (non-Javadoc)
// * @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
// */
// public void focusGained(FocusEvent e) {
// // Do nothing
// }
//
// /* (non-Javadoc)
// * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
// */
// public void focusLost(FocusEvent e) {
// DialogCellEditor.this.focusLost();
// }
// };
// }
//
// return buttonFocusListener;
// }
//
// /* (non-Javadoc)
// * Method declared on CellEditor.
// */
// protected void doSetValue(Object value) {
// this.value = value;
// updateContents(value);
// }
//
// /**
// * Returns the default label widget created by <code>createContents</code>.
// *
// * @return the default label widget
// */
// protected Label getDefaultLabel() {
// return defaultLabel;
// }
//
// /**
// * Opens a dialog box under the given parent control and returns the
// * dialog's value when it closes, or <code>null</code> if the dialog
// * was canceled or no selection was made in the dialog.
// * <p>
// * This framework method must be implemented by concrete subclasses.
// * It is called when the user has pressed the button and the dialog
// * box must pop up.
// * </p>
// *
// * @param cellEditorWindow the parent control cell editor's window
// * so that a subclass can adjust the dialog box accordingly
// * @return the selected value, or <code>null</code> if the dialog was
// * canceled or no selection was made in the dialog
// */
// protected abstract Object openDialogBox(Control cellEditorWindow);
//
// /**
// * Updates the controls showing the value of this cell editor.
// * <p>
// * The default implementation of this framework method just converts
// * the passed object to a string using <code>toString</code> and
// * sets this as the text of the label widget.
// * </p>
// * <p>
// * Subclasses may reimplement. If you reimplement this method, you
// * should also reimplement <code>createContents</code>.
// * </p>
// *
// * @param value the new value of this cell editor
// */
// protected void updateContents(Object value) {
// if (defaultLabel == null) {
// return;
// }
//
// String text = "";//$NON-NLS-1$
// if (value != null) {
// text = value.toString();
// }
// defaultLabel.setText(text);
// }
//}