Bug 29728 - [formatting] Format never finishes
Summary: [formatting] Format never finishes
Status: RESOLVED INVALID
Alias: None
Product: Platform
Classification: Eclipse Project
Component: Text (show other bugs)
Version: 2.1   Edit
Hardware: PC Windows XP
: P2 major (vote)
Target Milestone: ---   Edit
Assignee: Dani Megert CLA
QA Contact:
URL:
Whiteboard:
Keywords: needinfo
Depends on:
Blocks:
 
Reported: 2003-01-17 12:40 EST by Tod Creasey CLA
Modified: 2007-06-22 10:04 EDT (History)
0 users

See Also:


Attachments
Editor not redrawing (10.35 KB, image/gif)
2003-01-17 12:42 EST, Tod Creasey CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Tod Creasey CLA 2003-01-17 12:40:52 EST
20030107

I can't replicate this one consistently but twice today I had a case where 
formatting never completes and I have to close the editor.

I will attach a screen shot of what it looks like. If you close the editor and 
reopen you can continue but your changes are lost.
Comment 1 Tod Creasey CLA 2003-01-17 12:42:48 EST
Created attachment 3034 [details]
Editor not redrawing
Comment 2 Tod Creasey CLA 2003-01-30 15:17:52 EST
I am able to replicate consistently with the following contents of Dialog in 
JFace

package org.eclipse.jface.dialogs;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
import java.util.HashMap;

import org.eclipse.jface.resource.*;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;

/**
 * A dialog is a specialized window used for narrow-focused communication
 * with the user.
 * <p>
 * Dialogs are usually modal. Consequently, it is generally bad practice
 * to open a dialog without a parent. A model dialog without a parent 
 * is not prevented from disappearing behind the application's other windows,
 * making it very confusing for the user.
 * </p>
 */
public abstract class Dialog extends Window {

	/**
	 * Image registry key for error image (value 
<code>"dialog_error_image"</code>).
	 */
	public static final String DLG_IMG_ERROR = "dialog_error_image"; //
$NON-NLS-1$

	/**
	 * Image registry key for info image (value 
<code>"dialog_info_image"</code>).
	 */
	public static final String DLG_IMG_INFO = "dialog_info_image"; //$NON-
NLS-1$

	/**
	 * Image registry key for question image (value 
<code>"dialog_question_image"</code>).
	 */
	public static final String DLG_IMG_QUESTION 
= "dialog_question_image"; //$NON-NLS-1$

	/**
	 * Image registry key for warning image (value 
<code>"dialog_warning_image"</code>).
	 */
	public static final String DLG_IMG_WARNING = "dialog_warning_image"; //
$NON-NLS-1$

	/**
	 * Image registry key for info message image (value 
<code>"dialog_messsage_info_image"</code>).
	 * @since 2.0
	 */
	public static final String DLG_IMG_MESSAGE_INFO 
= "dialog_messasge_info_image"; //$NON-NLS-1$

	/**
	 * Image registry key for info message image (value 
<code>"dialog_messasge_warning_image"</code>).
	 * @since 2.0
	 */
	public static final String DLG_IMG_MESSAGE_WARNING 
= "dialog_messasge_warning_image"; //$NON-NLS-1$

	/**
	 * Image registry key for info message image (value 
<code>"dialog_message_error_image"</code>).
	 * @since 2.0
	 */
	public static final String DLG_IMG_MESSAGE_ERROR 
= "dialog_message_error_image"; //$NON-NLS-1$

	static {
		ImageRegistry reg = JFaceResources.getImageRegistry();
		reg.put(DLG_IMG_INFO, ImageDescriptor.createFromFile
(Dialog.class, "images/inform.gif")); //$NON-NLS-1$
		reg.put(DLG_IMG_QUESTION, ImageDescriptor.createFromFile
(Dialog.class, "images/question.gif")); //$NON-NLS-1$
		reg.put(DLG_IMG_WARNING, ImageDescriptor.createFromFile
(Dialog.class, "images/warning.gif")); //$NON-NLS-1$
		reg.put(DLG_IMG_ERROR, ImageDescriptor.createFromFile
(Dialog.class, "images/error.gif")); //$NON-NLS-1$

		reg.put(DLG_IMG_MESSAGE_INFO, ImageDescriptor.createFromFile
(Dialog.class, "images/message_info.gif")); //$NON-NLS-1$
		reg.put(DLG_IMG_MESSAGE_WARNING, ImageDescriptor.createFromFile
(Dialog.class, "images/message_warning.gif")); //$NON-NLS-1$
		reg.put(DLG_IMG_MESSAGE_ERROR, ImageDescriptor.createFromFile
(Dialog.class, "images/message_error.gif")); //$NON-NLS-1$
	}

	/**
	 * The dialog area; <code>null</code> until dialog is layed out.
	 */
	protected Control dialogArea;

	/**
	 * The button bar; <code>null</code> until dialog is layed out.
	 */
	protected Control buttonBar;

	/**
	 * Collection of buttons created by the <code>createButton</code> 
method.
	 */
	private HashMap buttons = new HashMap();

	/**
	 * Font metrics to use for determining pixel sizes.
	 */
	private FontMetrics fontMetrics;

	/**
	 * Number of horizontal dialog units per character, value 
<code>4</code>. 
	 */
	private static final int HORIZONTAL_DIALOG_UNIT_PER_CHAR = 4;

	/**
	 * Number of vertical dialog units per character, value 
<code>8</code>. 
	 */
	private static final int VERTICAL_DIALOG_UNITS_PER_CHAR = 8;

	/**
	 * Returns the number of pixels corresponding to the
	 * height of the given number of characters.
	 * <p>
	 * The required <code>FontMetrics</code> parameter may be created in 
the 
	 * following way:
	 * <code>
	 * 	GC gc = new GC(control);
	 *	gc.setFont(control.getFont());
	 *	fontMetrics = gc.getFontMetrics();
	 *	gc.dispose();
	 * </code>
	 * </p>
	 * 
	 * @param fontMetrics used in performing the conversion
	 * @param chars the number of characters
	 * @return the number of pixels
	 * @since 2.0
	 */
	public static int convertHeightInCharsToPixels(
		FontMetrics fontMetrics,
		int chars) {
		return fontMetrics.getHeight() * chars;
	}

	/**
	 * Returns the number of pixels corresponding to the
	 * given number of horizontal dialog units.
	 * <p>
	 * The required <code>FontMetrics</code> parameter may be created in 
the 
	 * following way:
	 * <code>
	 * 	GC gc = new GC(control);
	 *	gc.setFont(control.getFont());
	 *	fontMetrics = gc.getFontMetrics();
	 *	gc.dispose();
	 * </code>
	 * </p>
	 *
	 * @param fontMetrics used in performing the conversion
	 * @param dlus the number of horizontal dialog units
	 * @return the number of pixels
	 * @since 2.0
	 */
	public static int convertHorizontalDLUsToPixels(
		FontMetrics fontMetrics,
		int dlus) {
		// round to the nearest pixel
		return (
			fontMetrics.getAverageCharWidth() * dlus
				+ HORIZONTAL_DIALOG_UNIT_PER_CHAR / 2)
			/ HORIZONTAL_DIALOG_UNIT_PER_CHAR;
	}

	/**
	 * Returns the number of pixels corresponding to the
	 * given number of vertical dialog units.
	 * <p>
	 * The required <code>FontMetrics</code> parameter may be created in 
the 
	 * following way:
	 * <code>
	 * 	GC gc = new GC(control);
	 *	gc.setFont(control.getFont());
	 *	fontMetrics = gc.getFontMetrics();
	 *	gc.dispose();
	 * </code>
	 * </p>
	 *
	 * @param fontMetrics used in performing the conversion
	 * @param dlus the number of vertical dialog units
	 * @return the number of pixels
	 * @since 2.0
	 */
	public static int convertVerticalDLUsToPixels(
		FontMetrics fontMetrics,
		int dlus) {
		// round to the nearest pixel
		return (
			fontMetrics.getHeight() * dlus
				+ VERTICAL_DIALOG_UNITS_PER_CHAR / 2)
			/ VERTICAL_DIALOG_UNITS_PER_CHAR;
	}

	/**
	 * Returns the number of pixels corresponding to the
	 * width of the given number of characters.
	 * <p>
	 * The required <code>FontMetrics</code> parameter may be created in 
the 
	 * following way:
	 * <code>
	 * 	GC gc = new GC(control);
	 *	gc.setFont(control.getFont());
	 *	fontMetrics = gc.getFontMetrics();
	 *	gc.dispose();
	 * </code>
	 * </p>
	 *
	 * @param fontMetrics used in performing the conversion
	 * @param chars the number of characters
	 * @return the number of pixels
	 * @since 2.0
	 */
	public static int convertWidthInCharsToPixels(
		FontMetrics fontMetrics,
		int chars) {
		return fontMetrics.getAverageCharWidth() * chars;
	}

	/**
	 * Creates a dialog instance.
	 * Note that the window will have no visual representation (no widgets)
	 * until it is told to open. 
	 * By default, <code>open</code> blocks for dialogs.
	 *
	 * @param parentShell the parent shell, or <code>null</code> to create 
a top-level shell
	 */
	protected Dialog(Shell parentShell) {
		super(parentShell);
		setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
		setBlockOnOpen(true);
	}

	/**
	 * Notifies that this dialog's button with the given id has been 
pressed.
	 * <p>
	 * The <code>Dialog</code> implementation of this framework method 
calls
	 * <code>okPressed</code> if the ok button is the pressed,
	 * and <code>cancelPressed</code> if the cancel button is the pressed.
	 * All other button presses are ignored. Subclasses may override
	 * to handle other buttons, but should call 
<code>super.buttonPressed</code>
	 * if the default handling of the ok and cancel buttons is desired.
	 * </p>
	 *
	 * @param buttonId the id of the button that was pressed (see
	 *  <code>IDialogConstants.*_ID</code> constants)
	 */
	protected void buttonPressed(int buttonId) {
		if (IDialogConstants.OK_ID == buttonId)
			okPressed();
		else if (IDialogConstants.CANCEL_ID == buttonId)
			cancelPressed();
	}
	/**
	 * Notifies that the cancel button of this dialog has been pressed.
	 * <p>
	 * The <code>Dialog</code> implementation of this framework method sets
	 * this dialog's return code to <code>Window.CANCEL</code>
	 * and closes the dialog. Subclasses may override if desired.
	 * </p>
	 */
	protected void cancelPressed() {
		setReturnCode(CANCEL);
		close();
	}
	/**
	 * Constrain the shell size to be no larger than the display bounds.
	 * Reduce the shell size and move its origin as required.
	 * 
	 * @since 2.0
	 */
	protected void constrainShellSize() {
		// limit the shell size to the display size
		super.constrainShellSize();
		Shell shell = getShell();
		Point size = shell.getSize();
		Rectangle bounds = shell.getDisplay().getClientArea();

		// move the shell origin as required
		Point loc = shell.getLocation();

		//Choose the position between the origin of the client area 
and 
		//the bottom right hand corner
		int x =
			Math.max(
				bounds.x,
				Math.min(loc.x, bounds.x + bounds.width - 
size.x));
		int y =
			Math.max(
				bounds.y,
				Math.min(loc.y, bounds.y + bounds.height - 
size.y));
		shell.setLocation(x, y);
	}
	/**
	 * Returns the number of pixels corresponding to the
	 * height of the given number of characters.
	 * <p>
	 * This method may only be called after 
<code>initializeDialogUnits</code>
	 * has been called.
	 * </p>
	 * <p>
	 * Clients may call this framework method, but should not override it.
	 * </p>
	 *
	 * @param chars the number of characters
	 * @return the number of pixels
	 */
	protected int convertHeightInCharsToPixels(int chars) {
		// test for failure to initialize for backward compatibility
		if (fontMetrics == null)
			return 0;
		return convertHeightInCharsToPixels(fontMetrics, chars);
	}
	/**
	 * Returns the number of pixels corresponding to the
	 * given number of horizontal dialog units.
	 * <p>
	 * This method may only be called after 
<code>initializeDialogUnits</code>
	 * has been called.
	 * </p>
	 * <p>
	 * Clients may call this framework method, but should not override it.
	 * </p>
	 *
	 * @param dlus the number of horizontal dialog units
	 * @return the number of pixels
	 */
	protected int convertHorizontalDLUsToPixels(int dlus) {
		// test for failure to initialize for backward compatibility
		if (fontMetrics == null)
			return 0;
		return convertHorizontalDLUsToPixels(fontMetrics, dlus);
	}
	/**
	 * Returns the number of pixels corresponding to the
	 * given number of vertical dialog units.
	 * <p>
	 * This method may only be called after 
<code>initializeDialogUnits</code>
	 * has been called.
	 * </p>
	 * <p>
	 * Clients may call this framework method, but should not override it.
	 * </p>
	 *
	 * @param dlus the number of vertical dialog units
	 * @return the number of pixels
	 */
	protected int convertVerticalDLUsToPixels(int dlus) {
		// test for failure to initialize for backward compatibility
		if (fontMetrics == null)
			return 0;
		return convertVerticalDLUsToPixels(fontMetrics, dlus);
	}
	/**
	 * Returns the number of pixels corresponding to the
	 * width of the given number of characters.
	 * <p>
	 * This method may only be called after 
<code>initializeDialogUnits</code>
	 * has been called.
	 * </p>
	 * <p>
	 * Clients may call this framework method, but should not override it.
	 * </p>
	 *
	 * @param chars the number of characters
	 * @return the number of pixels
	 */
	protected int convertWidthInCharsToPixels(int chars) {
		// test for failure to initialize for backward compatibility
		if (fontMetrics == null)
			return 0;
		return convertWidthInCharsToPixels(fontMetrics, chars);
	}
	/**
	 * Creates a new button with the given id.
	 * <p>
	 * The <code>Dialog</code> implementation of this framework method
	 * creates a standard push button, registers it for selection events
	 * including button presses, and registers default buttons with its 
shell.
	 * The button id is stored as the button's client data.  If the button 
id 
	 * is <code>IDialogConstants.CANCEL_ID</code>, the new button will be 
	 * accessible from <code>getCancelButton()</code>.  If the button id 
is 
	 * <code>IDialogConstants.OK_ID</code>, the new button will be 
accesible 
	 * from <code>getOKButton()</code>.  Note that the parent's layout 
	 * is assumed to be a <code>GridLayout</code> and the number of 
columns in this 
	 * layout is incremented.  Subclasses may override.
	 * </p>
	 *
	 * @param parent the parent composite
	 * @param id the id of the button (see
	 *  <code>IDialogConstants.*_ID</code> constants 
	 *  for standard dialog button ids)
	 * @param label the label from the button
	 * @param defaultButton <code>true</code> if the button is to be the
	 *   default button, and <code>false</code> otherwise
	 * 
	 * @return the new button
	 * 
	 * @see getCancelButton
	 * @see getOKButton
	 */
	protected Button createButton(
		Composite parent,
		int id,
		String label,
		boolean defaultButton) {
		// increment the number of columns in the button bar
		 ((GridLayout) parent.getLayout()).numColumns++;

		Button button = new Button(parent, SWT.PUSH);

		button.setText(label);

		button.setData(new Integer(id));
		button.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				buttonPressed(((Integer) event.widget.getData
()).intValue());
			}
		});
		if (defaultButton) {
			Shell shell = parent.getShell();
			if (shell != null) {
				shell.setDefaultButton(button);
			}
		}
		button.setFont(parent.getFont());
		buttons.put(new Integer(id), button);
		setButtonLayoutData(button);

		return button;
	}

	/**
	 * Creates and returns the contents of this dialog's 
	 * button bar.
	 * <p>
	 * The <code>Dialog</code> implementation of this framework method
	 * lays out a button bar and calls the 
<code>createButtonsForButtonBar</code>
	 * framework method to populate it. Subclasses may override.
	 * </p>
	 * <p>
	 * The returned control's layout data must be an instance of 
	 * <code>GridData</code>.
	 * </p>
	 * 
	 * @param parent the parent composite to contain the button bar
	 * @return the button bar control
	 */
	protected Control createButtonBar(Composite parent) {
		Composite composite = new Composite(parent, SWT.NONE);

		// create a layout with spacing and margins appropriate for 
the font size.
		GridLayout layout = new GridLayout();
		layout.numColumns = 0; // this is incremented by createButton
		layout.makeColumnsEqualWidth = true;
		layout.marginWidth =
			convertHorizontalDLUsToPixels
(IDialogConstants.HORIZONTAL_MARGIN);
		layout.marginHeight =
			convertVerticalDLUsToPixels
(IDialogConstants.VERTICAL_MARGIN);
		layout.horizontalSpacing =
			convertHorizontalDLUsToPixels
(IDialogConstants.HORIZONTAL_SPACING);
		layout.verticalSpacing =
			convertVerticalDLUsToPixels
(IDialogConstants.VERTICAL_SPACING);

		composite.setLayout(layout);

		GridData data =
			new GridData(
				GridData.HORIZONTAL_ALIGN_END | 
GridData.VERTICAL_ALIGN_CENTER);
		composite.setLayoutData(data);

		composite.setFont(parent.getFont());

		// Add the buttons to the button bar.
		createButtonsForButtonBar(composite);

		return composite;
	}
	/**
	 * Adds buttons to this dialog's button bar.
	 * <p>
	 * The <code>Dialog</code> implementation of this framework method 
adds 
	 * standard ok and cancel buttons using the <code>createButton</code>
	 * framework method. These standard buttons will be accessible from 
	 * <code>getCancelButton</code>, and <code>getOKButton</code>.
	 * Subclasses may override.
	 * </p>
	 *
	 * @param parent the button bar composite
	 */
	protected void createButtonsForButtonBar(Composite parent) {
		// create OK and Cancel buttons by default
		createButton(
			parent,
			IDialogConstants.OK_ID,
			IDialogConstants.OK_LABEL,
			true);
		createButton(
			parent,
			IDialogConstants.CANCEL_ID,
			IDialogConstants.CANCEL_LABEL,
			false);
	}

	/*
	 * @see Window.configureShell()
	 */
	protected void configureShell(Shell newShell) {

		super.configureShell(newShell);
		newShell.setFont(JFaceResources.getDialogFont());
	}

	/*
	 * @see Window.initializeBounds()
	 */
	protected void initializeBounds() {
		String platform = SWT.getPlatform();
		if ("carbon".equals(platform)) { //$NON-NLS-1$
			// On Mac OS X the default button must be the right-
most button
			Shell shell = getShell();
			if (shell != null) {
				Button defaultButton = shell.getDefaultButton
();
				if (defaultButton != null
					&& isContained(buttonBar, 
defaultButton))
					defaultButton.moveBelow(null);
			}
		}
		super.initializeBounds();
	}

	/**
	 * Returns true if the given Control c is a direct or indirect child of
	 * container.
	 */
	private boolean isContained(Control container, Control c) {
		Composite parent;
		while ((parent = c.getParent()) != null) {
			if (parent == container)
				return true;
			c = parent;
		}
		return false;
	}

	/**
	 * The <code>Dialog</code> implementation of this <code>Window</code> 
method 
	 * creates and lays out the top level composite for the dialog, and
	 * determines the appropriate horizontal and vertical dialog units
	 * based on the font size. It then calls the 
<code>createDialogArea</code>
	 * and <code>createButtonBar</code> methods to create the dialog area
	 * and button bar, respectively. Overriding 
<code>createDialogArea</code> and
	 * <code>createButtonBar</code> are recommended rather than overriding
	 * this method.
	 */
	protected Control createContents(Composite parent) {
		// create the top level composite for the dialog
		Composite composite = new Composite(parent, 0);
		GridLayout layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		layout.verticalSpacing = 0;
		composite.setLayout(layout);
		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
		composite.setFont(parent.getFont());

		// initialize the dialog units
		initializeDialogUnits(composite);

		// create the dialog area and button bar
		dialogArea = createDialogArea(composite);
		buttonBar = createButtonBar(composite);

		return composite;
	}
	/**
	 * Creates and returns the contents of the upper part 
	 * of this dialog (above the button bar).
	 * <p>
	 * The <code>Dialog</code> implementation of this framework method
	 * creates and returns a new <code>Composite</code> with
	 * standard margins and spacing. 
	 * </p>
	 * <p>
	 * The returned control's layout data must be an instance of 
	 * <code>GridData</code>.
	 * </p>
	 * <p>
	 * Subclasses must override this method but may call <code>super</code>
	 * as in the following example:
	 * </p>	
	 * <pre>
	 * 	Composite composite = (Composite)super.createDialogArea
(parent);
	 * 	//add controls to composite as necessary
	 * 	return composite;
	 * </pre>
	 *
	 * @param parent the parent composite to contain the dialog area
	 * @return the dialog area control
	 */
	protected Control createDialogArea(Composite parent) {
		// create a composite with standard margins and spacing
		Composite composite = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.marginHeight =
			convertVerticalDLUsToPixels
(IDialogConstants.VERTICAL_MARGIN);
		layout.marginWidth =
			convertHorizontalDLUsToPixels
(IDialogConstants.HORIZONTAL_MARGIN);
		layout.verticalSpacing =
			convertVerticalDLUsToPixels
(IDialogConstants.VERTICAL_SPACING);
		layout.horizontalSpacing =
			convertHorizontalDLUsToPixels
(IDialogConstants.HORIZONTAL_SPACING);
		composite.setLayout(layout);
		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
		composite.setFont(parent.getFont());

		return composite;
	}
	/**
	 * Returns the button created by the method <code>createButton</code>
	 * for the specified ID as defined on <code>IDialogConstants</code>. 
If 
	 * <code>createButton</code> was never called with this ID, or 
	 * if <code>createButton</code> is overridden, this method will return
	 * <code>null</code>.
	 * 
	 * @return the button for the ID or <code>null</code>
	 * 
	 * @see createButton
	 * @since 2.0
	 */
	protected Button getButton(int id) {
		return (Button) buttons.get(new Integer(id));
	}
	/**
	 * Returns the button bar control.
	 * <p>
	 * Clients may call this framework method, but should not override it.
	 * </p>
	 *
	 * @return the button bar, or <code>null</code> if
	 * the button bar has not been created yet
	 */
	protected Control getButtonBar() {
		return buttonBar;
	}
	/**
	 * Returns the button created when <code>createButton</code> is called 
	 * with an ID of <code>IDialogConstants.CANCEL_ID</code>.  If 
	 * <code>createButton</code> was never called with this parameter, or 
	 * if <code>createButton</code> is overridden, 
<code>getCancelButton</code>
	 * will return <code>null</code>.
	 * 
	 * @return the cancel button or <code>null</code>
	 * 
	 * @see createButton
	 * @since 2.0
	 * @deprecated Use <code>getButton(IDialogConstants.CANCEL_ID)</code> 
instead.
	 * 		This method will be removed soon.
	 */
	protected Button getCancelButton() {
		return getButton(IDialogConstants.CANCEL_ID);
	}
	/**
	 * Returns the dialog area control.
	 * <p>
	 * Clients may call this framework method, but should not override it.
	 * </p>
	 *
	 * @return the dialog area, or <code>null</code> if
	 *   the dialog area has not been created yet
	 */
	protected Control getDialogArea() {
		return dialogArea;
	}
	/**
	 * Returns the standard dialog image with the given key.
	 * Note that these images are managed by the dialog framework, 
	 * and must not be disposed by another party.
	 *
	 * @param key one of the <code>Dialog.DLG_IMG_* </code> constants
	 * @return the standard dialog image
	 */
	public static Image getImage(String key) {
		return JFaceResources.getImageRegistry().get(key);
	}
	/**
	 * Returns the button created when <code>createButton</code> is called 
	 * with an ID of <code>IDialogConstants.OK_ID</code>.  If 
<code>createButton</code> 
	 * was never called with this parameter, or if 
<code>createButton</code> is 
	 * overridden, <code>getOKButton</code> will return <code>null</code>.
	 * 
	 * @return the OK button or <code>null</code>
	 * 
	 * @see createButton
	 * @since 2.0
	 * @deprecated Use <code>getButton(IDialogConstants.OK_ID)</code> 
instead.
	 * 		This method will be removed soon.
	 */
	protected Button getOKButton() {
		return getButton(IDialogConstants.OK_ID);
	}
	/**
	 * Initializes the computation of horizontal and vertical dialog units
	 * based on the size of current font.
	 * <p>
	 * This method must be called before any of the dialog unit based
	 * conversion methods are called.
	 * </p>
	 *
	 * @param control a control from which to obtain the current font
	 */
	protected void initializeDialogUnits(Control control) {
		// Compute and store a font metric
		GC gc = new GC(control);
		gc.setFont(JFaceResources.getDialogFont());
		fontMetrics = gc.getFontMetrics();
		gc.dispose();
	}
	/**
	 * Notifies that the ok button of this dialog has been pressed.
	 * <p>
	 * The <code>Dialog</code> implementation of this framework method sets
	 * this dialog's return code to <code>Window.OK</code>
	 * and closes the dialog. Subclasses may override.
	 * </p>
	 */
	protected void okPressed() {
		setReturnCode(OK);
		close();
	}

	/**
	 * Set the layout data of the button to a GridData with 
	 * appropriate heights and widths.
	 * @param button
	 */
	protected void setButtonLayoutData(Button button) {
		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
		data.heightHint =
			convertVerticalDLUsToPixels
(IDialogConstants.BUTTON_HEIGHT);
		int widthHint =
			convertHorizontalDLUsToPixels
(IDialogConstants.BUTTON_WIDTH);
		data.widthHint =
			Math.max(
				widthHint,
				button.computeSize(SWT.DEFAULT, SWT.DEFAULT, 
true).x);
		button.setLayoutData(data);
	}

	/**
	 * Set the layout data of the button to a FormData with appropriate 
heights and
	 * widths.
	 * @param button
	 */
	protected void setButtonLayoutFormData(Button button) {
		FormData data = new FormData();
		data.height =
			convertVerticalDLUsToPixels
(IDialogConstants.BUTTON_HEIGHT);
		int widthHint =
			convertHorizontalDLUsToPixels
(IDialogConstants.BUTTON_WIDTH);
		data.width =
			Math.max(
				widthHint,
				button.computeSize(SWT.DEFAULT, SWT.DEFAULT, 
true).x);
		button.setLayoutData(data);
	}

	/**
	 * @see org.eclipse.jface.window.Window#close()
	 */
	public boolean close() {
		boolean returnValue = super.close();
		if (returnValue) {
			buttons = new HashMap();
			buttonBar = null;
			dialogArea = null;
		}
		return returnValue;
	}

	/**
	 * Applies the dialog font to all controls that currently have the 
default
	 * font.
	 * 
	 * @param control the control to apply the font to. Font will also be 
applied to
	 * its children.
	 */
	public static void applyDialogFont(Control control) {
		Font dialogFont = JFaceResources.getDialogFont();
		Font defaultFont = JFaceResources.getDefaultFont();
		applyDialogFont(control, dialogFont, defaultFont);
	}

	/**
	 * Sets the dialog font on the control and any of its children if thier
	 * font is not otherwise set.
	 * 
	 * @param control the control to apply the font to. Font will also be 
applied to
	 * its children.
	 * @param dialogFont the dialog font to set
	 * @param defaultFont the default font to compare against
	 */
	private static void applyDialogFont(
		Control control,
		Font dialogFont,
		Font defaultFont) {

		if (control.getFont().equals(defaultFont))
			control.setFont(dialogFont);

		if (control instanceof Composite) {
			Control[] children = ((Composite) control).getChildren
();
			for (int i = 0; i < children.length; i++)
				applyDialogFont(children[i], dialogFont, 
defaultFont);
		}
	}
	
	/**
		 * Return the number of rows available in the current display 
using the
		* current font.
			 * @param parent
			 * @return int
			 */
		protected int availableRows(Composite parent) {

			int fontHeight = (parent.getFont().getFontData())
[0].getHeight();
			int displayHeight = parent.getDisplay().getBounds
().height;

			return displayHeight / fontHeight;
		}
}
Comment 3 Kai-Uwe Maetzel CLA 2003-02-06 13:00:06 EST
Tod, 
Do you have a stack dump?
Comment 4 Tod Creasey CLA 2003-02-06 13:42:03 EST
No I am afraid not. 
Comment 5 Dani Megert CLA 2003-09-15 06:46:01 EDT
Can't reproduce on newest build (I20030910).

I suggest you run Eclipse via console. This way you can create a stack dump next
time you see this and attach it to the reopened PR. We can't do anything without
the stack dump or a reproducible case.
Comment 6 Dani Megert CLA 2007-06-22 09:58:47 EDT
Get rid of deprecated state.
Comment 7 Dani Megert CLA 2007-06-22 10:04:12 EDT
.