package org.eclipse.jface.preference;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
 
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.util.Assert;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;

/**
 * A field editor for a font type preference.
 */
public class FontFieldEditor extends FieldEditor {
	
	/**
	 * The change font button, or <code>null</code> if none
	 * (before creation and after disposal).
	 */
	private Button changeFontButton = null;
	
	/**
	 * The text for the change font button, or <code>null</code>
	 * if missing.
	 */
	private String changeButtonText;

	/**
	 * Font data for the chosen font button, or <code>null</code> if none.
	 */
	private FontData[] chosenFont;
	
	/**
	 * The label that displays the selected font, or <code>null</code> if none.
	 */
	private Label valueControl;
	
	/**
	 * The previewer, or <code>null</code> if none.
	 */
	private DefaultPreviewer previewer;

	/**
	 * Internal font previewer implementation.
	 */
	private static class DefaultPreviewer {
		private Text text;
		private String string;
		private Font font;
		public DefaultPreviewer(String s, Composite parent) {
			string= s;
			text= new Text(parent, SWT.READ_ONLY | SWT.BORDER);
			text.addDisposeListener(new DisposeListener() {
				public void widgetDisposed(DisposeEvent e) {
					if (font != null)
						font.dispose();
				}
			});
			if (string != null)
				text.setText(string);	
		}
		
		public Control getControl() {
			return text;
		}

		public void setFont(FontData[] fontData) {
			if (font != null)
				font.dispose();
			font= new Font(text.getDisplay(), fontData);
			text.setFont(font);
		}
		public int getPreferredHeight() {
			return 60;
		}
	}
/**
 * Creates a new font field editor 
 */
protected FontFieldEditor() {
}
/**
 * Creates a font field editor with a preview window.
 * 
 * @param name the name of the preference this field editor works on
 * @param labelText the label text of the field editor
 * @param previewText the text used for the preview window
 * @param parent the parent of the field editor's control
 */
public FontFieldEditor(String name, String labelText, String previewText, Composite parent) {
	this(name,labelText,parent);
	Assert.isNotNull(previewText);
	previewer = new DefaultPreviewer(previewText, parent);
	
}
/**
 * Creates a font field editor without a preview.
 * 
 * @param name the name of the preference this field editor works on
 * @param labelText the label text of the field editor
 * @param parent the parent of the field editor's control
 */
public FontFieldEditor(String name, String labelText, Composite parent) {
	init(name, labelText);
	changeButtonText = JFaceResources.getString("openChange");//$NON-NLS-1$
	createControl(parent);
}
/* (non-Javadoc)
 * Method declared on FieldEditor.
 */
protected void adjustForNumColumns(int numColumns) {
	((GridData)valueControl.getLayoutData()).horizontalSpan = numColumns - 2;
	Control control = getPreviewControl();
	if (control != null) {
		((GridData)control.getLayoutData()).horizontalSpan = numColumns;
	}
}
/* (non-Javadoc)
 * Method declared on FieldEditor.
 */
protected void applyFont() {
	if (chosenFont != null && previewer != null)
		previewer.setFont(chosenFont);
}
/* (non-Javadoc)
 * Method declared on FieldEditor.
 */
protected void doFillIntoGrid(Composite parent, int numColumns) {
	Control control = getLabelControl(parent);

	valueControl = getValueControl(parent);
	GridData gd = new GridData(GridData.FILL_HORIZONTAL);
	gd.horizontalSpan = numColumns - 2;
	valueControl.setLayoutData(gd);

	changeFontButton = getChangeControl(parent);
	gd = new GridData();
	gd.horizontalAlignment = GridData.FILL;
	gd.heightHint = convertVerticalDLUsToPixels(changeFontButton, IDialogConstants.BUTTON_HEIGHT);
	int widthHint = convertHorizontalDLUsToPixels(changeFontButton, IDialogConstants.BUTTON_WIDTH);
	gd.widthHint = Math.max(widthHint, changeFontButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
	changeFontButton.setLayoutData(gd);

	control = getPreviewControl();
	if (control != null) {
		gd = new GridData();
		gd.horizontalAlignment = GridData.FILL;
		gd.horizontalSpan = numColumns;
		gd.heightHint = previewer.getPreferredHeight();
		control.setLayoutData(gd);
	}
}
/* (non-Javadoc)
 * Method declared on FieldEditor.
 */
protected void doLoad() {
	if (changeFontButton == null)
		return;
	updateFont(PreferenceConverter.getFontDataArray(getPreferenceStore(), getPreferenceName()));
}
/* (non-Javadoc)
 * Method declared on FieldEditor.
 */
protected void doLoadDefault() {
	if (changeFontButton == null)
		return;
	updateFont(PreferenceConverter.getDefaultFontDataArray(getPreferenceStore(), getPreferenceName()));
}
/* (non-Javadoc)
 * Method declared on FieldEditor.
 */
protected void doStore() {
	PreferenceConverter.setValue(getPreferenceStore(), getPreferenceName(), chosenFont);
}
/**
 * Returns the change button for this field editor.
 *
 * @return the change button
 */
protected Button getChangeControl(Composite parent) {
	if (changeFontButton == null) {
		changeFontButton= new Button(parent, SWT.PUSH);
		if(changeButtonText != null)
			changeFontButton.setText(changeButtonText);
		changeFontButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				FontDialog fontDialog= new FontDialog(changeFontButton.getShell());
				fontDialog.setFontData(chosenFont[0]);
				FontData font= fontDialog.open();
				if (font != null) {
					FontData[] oldFont= chosenFont;
					setPresentsDefaultValue(false);
					FontData[] newData = new FontData[1];
					newData[0] = font;
					updateFont(newData);
					fireValueChanged(VALUE, oldFont[0], font);
				}
				
			}
		});
		changeFontButton.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent event) {
				changeFontButton= null;
			}
		});
		changeFontButton.setFont(parent.getFont());
		setButtonLayoutData(changeFontButton);
	} else {
		checkParent(changeFontButton, parent);
	}
	return changeFontButton;	
}
/* (non-Javadoc)
 * Method declared on FieldEditor.
 */
public int getNumberOfControls() {
	return 3;
}
/**
 * Returns the preferred preview height. 
 *
 * @return the height, or <code>-1</code> if no previewer
 *  is installed
 */
public int getPreferredPreviewHeight() {
	if (previewer == null)
		return -1;
	return previewer.getPreferredHeight();
}
/**
 * Returns the preview control for this field editor.
 *
 * @return the preview control
 */
public Control getPreviewControl() {
	if (previewer == null)
		return null;

	return previewer.getControl();
}
/**
 * Returns the value control for this field editor. The value control
 * displays the currently selected font name.
 *
 * @return the value control
 */
protected Label getValueControl(Composite parent) {
	if (valueControl == null) {
		valueControl = new Label(parent, SWT.LEFT);
		valueControl.setFont(parent.getFont());
		valueControl.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent event) {
				valueControl = null;
			}
		});
	} else {
		checkParent(valueControl, parent);
	}
	return valueControl;
}
/**
 * Sets the text of the change button.
 *
 * @param text the new text
 */
public void setChangeButtonText(String text) {
	Assert.isNotNull(text);
	changeButtonText = text;
	if (changeFontButton != null)
		changeFontButton.setText(text);
}
/**
 * Updates the change font button and the previewer to reflect the
 * newly selected font.
 */
private void updateFont(FontData font[]) {
	FontData[] bestFont = 
		JFaceResources.getFontRegistry().
			bestDataArray(font,valueControl.getDisplay());

	//if we have nothing valid do as best we can
	if(bestFont == null)
		bestFont = getDefaultFontData();
		
	//Now cache this value in the receiver
	this.chosenFont = bestFont;
	
	if (valueControl != null) {
		valueControl.setText(StringConverter.asString(chosenFont[0]));
	}
	if (previewer != null) {
		previewer.setFont(bestFont);
	}
}
/**
 * Store the default preference for the field
 * being edited
 */
protected void setToDefault(){
	FontData[] defaultFontData = 
		PreferenceConverter.getDefaultFontDataArray(getPreferenceStore(),getPreferenceName());
	PreferenceConverter.setValue(
		getPreferenceStore(), 
		getPreferenceName(), 
		defaultFontData);
}

/**
 * Get the system default font data.
 */
private FontData[] getDefaultFontData(){
	return valueControl.getDisplay().getSystemFont().getFontData();
}

/*
 * @see FieldEditor.setEnabled(boolean,Composite).
 */
public void setEnabled(boolean enabled, Composite parent){
	super.setEnabled(enabled,parent);
	getChangeControl(parent).setEnabled(enabled);
	getValueControl(parent).setEnabled(enabled);
}

}
